From bd1dc4235435ec4e39dd395608add8eeb3fd4007 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Mon, 11 Sep 2017 23:11:35 +0300 Subject: [PATCH 001/149] first commit --- README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 00000000..df54dbe3 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# clever_bundle From 00f227ad8a879b7a772578535f2bc44a8e546c6d Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Mon, 11 Sep 2017 23:28:14 +0300 Subject: [PATCH 002/149] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index df54dbe3..6a0ce923 100644 --- a/README.md +++ b/README.md @@ -1 +1,3 @@ # clever_bundle + +Здесь будет великая вещь. From 901cc27776fe3397c1bc83cc036eb5dc34d45fc3 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Mon, 11 Sep 2017 23:55:41 +0300 Subject: [PATCH 003/149] Add marker_navigator --- .gitmodules | 3 +++ marker_navigator | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 marker_navigator diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..10e27f0e --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "marker_navigator"] + path = marker_navigator + url = https://github.com/CopterExpress/marker_navigator.git diff --git a/marker_navigator b/marker_navigator new file mode 160000 index 00000000..33881d8a --- /dev/null +++ b/marker_navigator @@ -0,0 +1 @@ +Subproject commit 33881d8a1a51a586d606650d8d13192a33bc2f1e From 261339374804d566ee91c8a86b780d9e41d0bfbb Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Mon, 11 Sep 2017 23:59:03 +0300 Subject: [PATCH 004/149] clever_suite --- clever_suite/readme.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 clever_suite/readme.md diff --git a/clever_suite/readme.md b/clever_suite/readme.md new file mode 100644 index 00000000..00b6627a --- /dev/null +++ b/clever_suite/readme.md @@ -0,0 +1 @@ +Мета-пакет со всеми ROS-зависимостями From d0f2dda58b52832fe26788e03f916fbd8c43ad5b Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Tue, 7 Nov 2017 15:35:53 +0300 Subject: [PATCH 005/149] Add some deploy files + readme --- README.md | 33 ++++++++++++++++++++++++++++++++- clever_suite/readme.md | 1 - deploy/clever.service | 11 +++++++++++ deploy/roscore.env | 10 ++++++++++ deploy/roscore.service | 11 +++++++++++ 5 files changed, 64 insertions(+), 2 deletions(-) delete mode 100644 clever_suite/readme.md create mode 100644 deploy/clever.service create mode 100644 deploy/roscore.env create mode 100644 deploy/roscore.service diff --git a/README.md b/README.md index 6a0ce923..747773f3 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,34 @@ # clever_bundle -Здесь будет великая вещь. +Пакет программ и библиотек для Клевера. + +Установка +--------- + +Склонировать репозиторий в папку `/home/pi/catkin_ws/src/clever` (**важно**): + +```bash +cd ~/catkin_ws/src +git clone https://github.com/CopterExpress/clever_bundle.git clever +``` + +Пересобрать ROS-пакеты: + +```bash +cd ~/catkin_ws +catkin_make -j1 +``` + +Включить сервис roscore (если он не включен): + +```bash +sudo systemctl enable catkin_ws/src/clever/deploy/roscore.service +sudo systemctl start roscore +``` + +Включить сервис clever: + +```bash +sudo systemctl enable catkin_ws/src/clever/deploy/clever.service +sudo systemctl start clever +``` diff --git a/clever_suite/readme.md b/clever_suite/readme.md deleted file mode 100644 index 00b6627a..00000000 --- a/clever_suite/readme.md +++ /dev/null @@ -1 +0,0 @@ -Мета-пакет со всеми ROS-зависимостями diff --git a/deploy/clever.service b/deploy/clever.service new file mode 100644 index 00000000..460ed405 --- /dev/null +++ b/deploy/clever.service @@ -0,0 +1,11 @@ +[Unit] +Description=Launcher for the ROS master, parameter server and rosout logging node +After=network.target + +[Service] +EnvironmentFile=/home/pi/catkin_ws/src/clever/deploy/roscore.env +ExecStart=/opt/ros/kinetic/bin/roslaunch clever clever.launch +Restart=on-abort + +[Install] +WantedBy=multi-user.target diff --git a/deploy/roscore.env b/deploy/roscore.env new file mode 100644 index 00000000..f794e05b --- /dev/null +++ b/deploy/roscore.env @@ -0,0 +1,10 @@ +ROS_ROOT=/opt/ros/kinetic/share/ros +ROS_DISTRO=kinetic +ROS_PACKAGE_PATH=/home/pi/catkin_ws/src:/opt/ros/kinetic/share +ROS_PORT=11311 +ROS_MASTER_URI=http://localhost:11311 +CMAKE_PREFIX_PATH=/home/pi/catkin_ws/devel:/opt/ros/kinetic +PATH=/opt/ros/kinetic/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin +LD_LIBRARY_PATH=/opt/ros/kinetic/lib +PYTHONPATH=/home/pi/catkin_ws/devel/lib/python2.7/dist-packages:/opt/ros/kinetic/lib/python2.7/dist-packages +ROS_IP=192.168.11.1 \ No newline at end of file diff --git a/deploy/roscore.service b/deploy/roscore.service new file mode 100644 index 00000000..56f949ac --- /dev/null +++ b/deploy/roscore.service @@ -0,0 +1,11 @@ +[Unit] +Description=Launcher for the ROS master, parameter server and rosout logging node +After=network.target + +[Service] +EnvironmentFile=/home/pi/catkin_ws/src/clever/deploy/roscore.env +ExecStart=/opt/ros/kinetic/bin/roscore +Restart=on-abort + +[Install] +WantedBy=multi-user.target From dfebf7e4e28b8348ede395dc9b8ba82df07f6420 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Tue, 7 Nov 2017 15:36:25 +0300 Subject: [PATCH 006/149] Launch-file for the bottom camera --- clever/camera_info/fisheye_cam.yaml | 20 ++++++++++++++++++++ clever/launch/bottom_camera.launch | 14 ++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 clever/camera_info/fisheye_cam.yaml create mode 100644 clever/launch/bottom_camera.launch diff --git a/clever/camera_info/fisheye_cam.yaml b/clever/camera_info/fisheye_cam.yaml new file mode 100644 index 00000000..55946f2c --- /dev/null +++ b/clever/camera_info/fisheye_cam.yaml @@ -0,0 +1,20 @@ +image_width: 2592 +image_height: 1944 +distortion_model: pinhole +camera_name: raspicam +camera_matrix: + rows: 3 + cols: 3 + data: [1.34689524e+03, 0., 1.30767920e+03, 0., 1.35094361e+03, 9.60238450e+02, 0.0e+00, 0.0e+00, 1.0] +distortion_coefficients: + rows: 1 + cols: 8 + data: [1.11718277e+00, 4.70912345e-01, -2.16258281e-04, 1.71516924e-04, 2.32202095e-02, 1.46837794e+00, 7.92173021e-01, 1.19647684e-01] +rectification_matrix: + rows: 3 + cols: 3 + data: [1, 0, 0, 0, 1, 0, 0, 0, 1] +projection_matrix: + rows: 3 + cols: 4 + data: [1.34689524e+03, 0., 1.30767920e+03, 0., 0., 1.35094361e+03, 9.60238450e+02, 0., 0., 0., 1., 0.] diff --git a/clever/launch/bottom_camera.launch b/clever/launch/bottom_camera.launch new file mode 100644 index 00000000..26f4fc5c --- /dev/null +++ b/clever/launch/bottom_camera.launch @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + From 6d1f215de2957b0af3b8d4dfab36c3fd6a89ccb0 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Tue, 7 Nov 2017 15:37:03 +0300 Subject: [PATCH 007/149] clever ros-package --- clever/CMakeLists.txt | 195 ++++++++++++++++++++++++++++++++++++++++++ clever/package.xml | 50 +++++++++++ 2 files changed, 245 insertions(+) create mode 100644 clever/CMakeLists.txt create mode 100644 clever/package.xml diff --git a/clever/CMakeLists.txt b/clever/CMakeLists.txt new file mode 100644 index 00000000..b3cb2aba --- /dev/null +++ b/clever/CMakeLists.txt @@ -0,0 +1,195 @@ +cmake_minimum_required(VERSION 2.8.3) +project(clever) + +## Compile as C++11, supported in ROS Kinetic and newer +# add_compile_options(-std=c++11) + +## Find catkin macros and libraries +## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz) +## is used, also find other catkin packages +find_package(catkin REQUIRED) + +## System dependencies are found with CMake's conventions +# find_package(Boost REQUIRED COMPONENTS system) + + +## Uncomment this if the package has a setup.py. This macro ensures +## modules and global scripts declared therein get installed +## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html +# catkin_python_setup() + +################################################ +## Declare ROS messages, services and actions ## +################################################ + +## To declare and build messages, services or actions from within this +## package, follow these steps: +## * Let MSG_DEP_SET be the set of packages whose message types you use in +## your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...). +## * In the file package.xml: +## * add a build_depend tag for "message_generation" +## * add a build_depend and a run_depend tag for each package in MSG_DEP_SET +## * If MSG_DEP_SET isn't empty the following dependency has been pulled in +## but can be declared for certainty nonetheless: +## * add a run_depend tag for "message_runtime" +## * In this file (CMakeLists.txt): +## * add "message_generation" and every package in MSG_DEP_SET to +## find_package(catkin REQUIRED COMPONENTS ...) +## * add "message_runtime" and every package in MSG_DEP_SET to +## catkin_package(CATKIN_DEPENDS ...) +## * uncomment the add_*_files sections below as needed +## and list every .msg/.srv/.action file to be processed +## * uncomment the generate_messages entry below +## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...) + +## Generate messages in the 'msg' folder +# add_message_files( +# FILES +# Message1.msg +# Message2.msg +# ) + +## Generate services in the 'srv' folder +# add_service_files( +# FILES +# Service1.srv +# Service2.srv +# ) + +## Generate actions in the 'action' folder +# add_action_files( +# FILES +# Action1.action +# Action2.action +# ) + +## Generate added messages and services with any dependencies listed here +# generate_messages( +# DEPENDENCIES +# std_msgs # Or other packages containing msgs +# ) + +################################################ +## Declare ROS dynamic reconfigure parameters ## +################################################ + +## To declare and build dynamic reconfigure parameters within this +## package, follow these steps: +## * In the file package.xml: +## * add a build_depend and a run_depend tag for "dynamic_reconfigure" +## * In this file (CMakeLists.txt): +## * add "dynamic_reconfigure" to +## find_package(catkin REQUIRED COMPONENTS ...) +## * uncomment the "generate_dynamic_reconfigure_options" section below +## and list every .cfg file to be processed + +## Generate dynamic reconfigure parameters in the 'cfg' folder +# generate_dynamic_reconfigure_options( +# cfg/DynReconf1.cfg +# cfg/DynReconf2.cfg +# ) + +################################### +## catkin specific configuration ## +################################### +## The catkin_package macro generates cmake config files for your package +## Declare things to be passed to dependent projects +## INCLUDE_DIRS: uncomment this if you package contains header files +## LIBRARIES: libraries you create in this project that dependent projects also need +## CATKIN_DEPENDS: catkin_packages dependent projects also need +## DEPENDS: system dependencies of this project that dependent projects also need +catkin_package( +# INCLUDE_DIRS include +# LIBRARIES clever +# CATKIN_DEPENDS other_catkin_pkg +# DEPENDS system_lib +) + +########### +## Build ## +########### + +## Specify additional locations of header files +## Your package locations should be listed before other locations +include_directories( +# include +# ${catkin_INCLUDE_DIRS} +) + +## Declare a C++ library +# add_library(${PROJECT_NAME} +# src/${PROJECT_NAME}/clever.cpp +# ) + +## Add cmake target dependencies of the library +## as an example, code may need to be generated before libraries +## either from message generation or dynamic reconfigure +# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + +## Declare a C++ executable +## With catkin_make all packages are built within a single CMake context +## The recommended prefix ensures that target names across packages don't collide +# add_executable(${PROJECT_NAME}_node src/clever_node.cpp) + +## Rename C++ executable without prefix +## The above recommended prefix causes long target names, the following renames the +## target back to the shorter version for ease of user use +## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node" +# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "") + +## Add cmake target dependencies of the executable +## same as for the library above +# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + +## Specify libraries to link a library or executable target against +# target_link_libraries(${PROJECT_NAME}_node +# ${catkin_LIBRARIES} +# ) + +############# +## Install ## +############# + +# all install targets should use catkin DESTINATION variables +# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html + +## Mark executable scripts (Python etc.) for installation +## in contrast to setup.py, you can choose the destination +# install(PROGRAMS +# scripts/my_python_script +# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +# ) + +## Mark executables and/or libraries for installation +# install(TARGETS ${PROJECT_NAME} ${PROJECT_NAME}_node +# ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} +# LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} +# RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +# ) + +## Mark cpp header files for installation +# install(DIRECTORY include/${PROJECT_NAME}/ +# DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} +# FILES_MATCHING PATTERN "*.h" +# PATTERN ".svn" EXCLUDE +# ) + +## Mark other files for installation (e.g. launch and bag files, etc.) +# install(FILES +# # myfile1 +# # myfile2 +# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} +# ) + +############# +## Testing ## +############# + +## Add gtest based cpp test target and link libraries +# catkin_add_gtest(${PROJECT_NAME}-test test/test_clever.cpp) +# if(TARGET ${PROJECT_NAME}-test) +# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME}) +# endif() + +## Add folders to be run by python nosetests +# catkin_add_nosetests(test) diff --git a/clever/package.xml b/clever/package.xml new file mode 100644 index 00000000..b41ce0f3 --- /dev/null +++ b/clever/package.xml @@ -0,0 +1,50 @@ + + + clever + 0.0.1 + The clever package + + + + + Oleg Kalachev + + + + + + TODO + + + + + + + + + + + + + + + + + + + + + + + + + + catkin + + + + + + + + From 13a6efc4db996d93ef63faee67ddf5361bd389c7 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Tue, 7 Nov 2017 15:37:54 +0300 Subject: [PATCH 008/149] Launch-file for mavros and copter visualization node --- clever/launch/copter_visualization.launch | 12 +++++++++++ clever/launch/mavros.launch | 25 +++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 clever/launch/copter_visualization.launch create mode 100644 clever/launch/mavros.launch diff --git a/clever/launch/copter_visualization.launch b/clever/launch/copter_visualization.launch new file mode 100644 index 00000000..24006baf --- /dev/null +++ b/clever/launch/copter_visualization.launch @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/clever/launch/mavros.launch b/clever/launch/mavros.launch new file mode 100644 index 00000000..0e84e0ba --- /dev/null +++ b/clever/launch/mavros.launch @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + From fe624b7f5963d69bc6826c1b3845644ce14a5344 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Tue, 7 Nov 2017 15:38:25 +0300 Subject: [PATCH 009/149] Simple web-server node for serving Clever interface --- clever/launch/web_server.launch | 5 +++++ clever/requirements.txt | 1 + clever/src/web_server.py | 28 ++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 clever/launch/web_server.launch create mode 100644 clever/requirements.txt create mode 100644 clever/src/web_server.py diff --git a/clever/launch/web_server.launch b/clever/launch/web_server.launch new file mode 100644 index 00000000..9d8944ac --- /dev/null +++ b/clever/launch/web_server.launch @@ -0,0 +1,5 @@ + + + + + diff --git a/clever/requirements.txt b/clever/requirements.txt new file mode 100644 index 00000000..484d3c57 --- /dev/null +++ b/clever/requirements.txt @@ -0,0 +1 @@ +flask==0.12.2 diff --git a/clever/src/web_server.py b/clever/src/web_server.py new file mode 100644 index 00000000..d035ac4b --- /dev/null +++ b/clever/src/web_server.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python + +import rospy +from flask import Flask, send_from_directory, send_file + + +rospy.init_node('web_server', disable_signals=True) + + +port = rospy.get_param('~port', 8080) +host = rospy.get_param('~host', '0.0.0.0') +serve_path = rospy.get_param('~path') +app = Flask(__name__) + + +@app.route('/') +def serve_index(): + return send_from_directory(serve_path, 'index.html') + + +@app.route('/') +def serve_static(path): + print serve_path, path + return send_from_directory(serve_path, path) + + +rospy.loginfo('Serving on %s:%s', host, port) +app.run(host=host, port=port, threaded=True) From 29dc58a6ca2054d1d7637c3fa019e4d37bed7b64 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Tue, 7 Nov 2017 15:39:41 +0300 Subject: [PATCH 010/149] +x for web_server.py --- clever/src/web_server.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 clever/src/web_server.py diff --git a/clever/src/web_server.py b/clever/src/web_server.py old mode 100644 new mode 100755 From 258ebe76848468c3d82b7e0624621193d8ecd763 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Tue, 7 Nov 2017 15:41:57 +0300 Subject: [PATCH 011/149] Common launch-file for Clever --- clever/launch/clever.launch | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 clever/launch/clever.launch diff --git a/clever/launch/clever.launch b/clever/launch/clever.launch new file mode 100644 index 00000000..42e538d7 --- /dev/null +++ b/clever/launch/clever.launch @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 421f766a94724b8afead562279598fc94472a98a Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Tue, 7 Nov 2017 16:04:24 +0300 Subject: [PATCH 012/149] Describe ROS-requirements in readme --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index 747773f3..1caf379d 100644 --- a/README.md +++ b/README.md @@ -32,3 +32,19 @@ sudo systemctl start roscore sudo systemctl enable catkin_ws/src/clever/deploy/clever.service sudo systemctl start clever ``` + +Зависимости +----------- + +Необходимые для работы ROS-пакеты: + +* `mavros` +* `rosbridge_suite` +* `web_video_server` +* `cv_camera` +* `nodelet` +* `dynamic_reconfigure` +* `bondcpp`, ветка `master` +* `roslint` + +TODO: внести в package.xml From 9526f1aeaf66f4e86364d965fd0eb7e88e3302f2 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Tue, 7 Nov 2017 20:32:52 +0300 Subject: [PATCH 013/149] Enable vizualisation by defult --- clever/launch/clever.launch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clever/launch/clever.launch b/clever/launch/clever.launch index 42e538d7..3a0ee366 100644 --- a/clever/launch/clever.launch +++ b/clever/launch/clever.launch @@ -1,7 +1,7 @@ - + From 4c69963593e8aabe9e6184b2f0acf9f4a75f2769 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Tue, 7 Nov 2017 20:33:14 +0300 Subject: [PATCH 014/149] clever.service requires roscore --- deploy/clever.service | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/deploy/clever.service b/deploy/clever.service index 460ed405..b0de6020 100644 --- a/deploy/clever.service +++ b/deploy/clever.service @@ -1,6 +1,7 @@ [Unit] Description=Launcher for the ROS master, parameter server and rosout logging node -After=network.target +Requires=roscore +After=roscore [Service] EnvironmentFile=/home/pi/catkin_ws/src/clever/deploy/roscore.env From 9b8f422d0f776a17f554b87dc15b95e6a6b0c65b Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Tue, 7 Nov 2017 22:21:41 +0300 Subject: [PATCH 015/149] Wait for roscore master in clever service file + some fixes --- deploy/clever.service | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/deploy/clever.service b/deploy/clever.service index b0de6020..4939ed29 100644 --- a/deploy/clever.service +++ b/deploy/clever.service @@ -1,11 +1,11 @@ [Unit] -Description=Launcher for the ROS master, parameter server and rosout logging node -Requires=roscore +Description=Clever ROS package +Requires=roscore.service After=roscore [Service] EnvironmentFile=/home/pi/catkin_ws/src/clever/deploy/roscore.env -ExecStart=/opt/ros/kinetic/bin/roslaunch clever clever.launch +ExecStart=/opt/ros/kinetic/bin/roslaunch clever clever.launch --wait Restart=on-abort [Install] From c38d2e62a88b2b8182116c38bc5195360dadc469 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Wed, 8 Nov 2017 01:19:03 +0300 Subject: [PATCH 016/149] Remove marker_navigator for a while --- marker_navigator | 1 - 1 file changed, 1 deletion(-) delete mode 160000 marker_navigator diff --git a/marker_navigator b/marker_navigator deleted file mode 160000 index 33881d8a..00000000 --- a/marker_navigator +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 33881d8a1a51a586d606650d8d13192a33bc2f1e From 5c470bd8709be99b07b7fc16acef8d0e7dbf9060 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Wed, 8 Nov 2017 01:20:21 +0300 Subject: [PATCH 017/149] Fix --- deploy/clever.service | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/clever.service b/deploy/clever.service index 4939ed29..282ab0af 100644 --- a/deploy/clever.service +++ b/deploy/clever.service @@ -1,7 +1,7 @@ [Unit] Description=Clever ROS package Requires=roscore.service -After=roscore +After=roscore.service [Service] EnvironmentFile=/home/pi/catkin_ws/src/clever/deploy/roscore.env From b26cf3d3ecb616af60f2ffefafedf8a890235ed5 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Wed, 15 Nov 2017 19:02:29 +0300 Subject: [PATCH 018/149] Add launching FPV camera to the launch-file --- clever/launch/clever.launch | 7 +++++++ clever/launch/fpv_camera.launch | 6 ++++++ clever/src/fpv_camera | 8 ++++++++ 3 files changed, 21 insertions(+) create mode 100644 clever/launch/fpv_camera.launch create mode 100644 clever/src/fpv_camera diff --git a/clever/launch/clever.launch b/clever/launch/clever.launch index 3a0ee366..272619ce 100644 --- a/clever/launch/clever.launch +++ b/clever/launch/clever.launch @@ -6,6 +6,8 @@ + + @@ -29,4 +31,9 @@ + + + + + diff --git a/clever/launch/fpv_camera.launch b/clever/launch/fpv_camera.launch new file mode 100644 index 00000000..359ef14f --- /dev/null +++ b/clever/launch/fpv_camera.launch @@ -0,0 +1,6 @@ + + + + + + diff --git a/clever/src/fpv_camera b/clever/src/fpv_camera new file mode 100644 index 00000000..832b7059 --- /dev/null +++ b/clever/src/fpv_camera @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +# Usage +# fpv_camera + +echo "Starting FPV camera $1 on :$2" +cd /home/pi/mjpg-streamer/mjpg-streamer-experimental +./mjpg_streamer -i "./input_uvc.so -d $1 -r 1024x720 -f 30" -o "./output_http.so -w ./www -p $2" From e47b8c10ecd1c0cb60983ce644207a597d80f179 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Wed, 15 Nov 2017 19:02:37 +0300 Subject: [PATCH 019/149] =?UTF-8?q?Change=20default=20web=20server?= =?UTF-8?q?=E2=80=99s=20port=20to=207070?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- clever/src/web_server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clever/src/web_server.py b/clever/src/web_server.py index d035ac4b..4ea47451 100755 --- a/clever/src/web_server.py +++ b/clever/src/web_server.py @@ -7,7 +7,7 @@ from flask import Flask, send_from_directory, send_file rospy.init_node('web_server', disable_signals=True) -port = rospy.get_param('~port', 8080) +port = rospy.get_param('~port', 7070) host = rospy.get_param('~host', '0.0.0.0') serve_path = rospy.get_param('~path') app = Flask(__name__) From f06e59e6ad6b675ebd67f9cc7cac9f42741357b4 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Wed, 15 Nov 2017 19:02:43 +0300 Subject: [PATCH 020/149] Comment --- clever/launch/clever.launch | 1 + 1 file changed, 1 insertion(+) diff --git a/clever/launch/clever.launch b/clever/launch/clever.launch index 272619ce..8a6f1cab 100644 --- a/clever/launch/clever.launch +++ b/clever/launch/clever.launch @@ -27,6 +27,7 @@ + From b8d57b8b423268c7dfb0e5885467ba86fa45ad9f Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Wed, 15 Nov 2017 22:02:12 +0300 Subject: [PATCH 021/149] Arudino-bridge launch file --- README.md | 1 + clever/launch/arduino.launch | 9 +++++++++ clever/launch/clever.launch | 4 ++++ 3 files changed, 14 insertions(+) create mode 100644 clever/launch/arduino.launch diff --git a/README.md b/README.md index 1caf379d..a8f8878a 100644 --- a/README.md +++ b/README.md @@ -46,5 +46,6 @@ sudo systemctl start clever * `dynamic_reconfigure` * `bondcpp`, ветка `master` * `roslint` +* `rosserial` TODO: внести в package.xml diff --git a/clever/launch/arduino.launch b/clever/launch/arduino.launch new file mode 100644 index 00000000..6ddddf9e --- /dev/null +++ b/clever/launch/arduino.launch @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/clever/launch/clever.launch b/clever/launch/clever.launch index 8a6f1cab..ac5921db 100644 --- a/clever/launch/clever.launch +++ b/clever/launch/clever.launch @@ -8,6 +8,7 @@ + @@ -37,4 +38,7 @@ + + + From 0ae0f6a9b8d577bcb5037a592b0c96b1b5ecf018 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 16 Nov 2017 22:04:06 +0300 Subject: [PATCH 022/149] gcs_bridge clever launch file argument: tcp or udp --- clever/launch/clever.launch | 4 ++-- clever/launch/mavros.launch | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/clever/launch/clever.launch b/clever/launch/clever.launch index ac5921db..f57be01b 100644 --- a/clever/launch/clever.launch +++ b/clever/launch/clever.launch @@ -1,6 +1,6 @@ - + @@ -13,7 +13,7 @@ - + diff --git a/clever/launch/mavros.launch b/clever/launch/mavros.launch index 0e84e0ba..03cc583e 100644 --- a/clever/launch/mavros.launch +++ b/clever/launch/mavros.launch @@ -1,6 +1,6 @@ - + @@ -10,8 +10,8 @@ - - + + From 06d8fef66876b4ef9843befc0b8eba74bc053cc1 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 16 Nov 2017 22:04:20 +0300 Subject: [PATCH 023/149] Lower default fpv camera resolution --- clever/src/fpv_camera | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clever/src/fpv_camera b/clever/src/fpv_camera index 832b7059..7ca4981d 100644 --- a/clever/src/fpv_camera +++ b/clever/src/fpv_camera @@ -5,4 +5,4 @@ echo "Starting FPV camera $1 on :$2" cd /home/pi/mjpg-streamer/mjpg-streamer-experimental -./mjpg_streamer -i "./input_uvc.so -d $1 -r 1024x720 -f 30" -o "./output_http.so -w ./www -p $2" +./mjpg_streamer -i "./input_uvc.so -d $1 -r 320x240 -f 30" -o "./output_http.so -w ./www -p $2" From 76e020d16244a69f2570a8586d657e26f7865230 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Fri, 17 Nov 2017 01:44:26 +0300 Subject: [PATCH 024/149] Clever Arduino bundle generator + clever_arduino.tar.gz (first version) --- deploy/clever_arudino.tar.gz | Bin 0 -> 164791 bytes deploy/generate_ros_lib | 9 +++++++++ 2 files changed, 9 insertions(+) create mode 100644 deploy/clever_arudino.tar.gz create mode 100644 deploy/generate_ros_lib diff --git a/deploy/clever_arudino.tar.gz b/deploy/clever_arudino.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..f3b0de39177dac453f4c134bfd5765dc442fe37c GIT binary patch literal 164791 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≺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%0DMtCtJE;E#b7M2wz*egNW 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 BBZL3| literal 0 HcmV?d00001 diff --git a/deploy/generate_ros_lib b/deploy/generate_ros_lib new file mode 100644 index 00000000..b72c5602 --- /dev/null +++ b/deploy/generate_ros_lib @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +# This script generates ros_lib library for Arduino for using with rosseial_arduino: +# http://wiki.ros.org/rosserial_arduino/Tutorials +# https://copterexpress.gitbooks.io/clever/content/docs/arduino.html + +rm -rf ros_lib +rosrun rosserial_arduino make_libraries.py . +tar czf clever_arudino.tar.gz ros_lib From dbaa8bdf8813c3797733cc9f0f964be5e5ed6d15 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Fri, 17 Nov 2017 05:23:02 +0300 Subject: [PATCH 025/149] =?UTF-8?q?=E2=80=98udp=E2=80=99=20fcu=5Fconn=20in?= =?UTF-8?q?=20mavros=20launch-file?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- clever/launch/clever.launch | 2 ++ clever/launch/mavros.launch | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/clever/launch/clever.launch b/clever/launch/clever.launch index f57be01b..011db8e4 100644 --- a/clever/launch/clever.launch +++ b/clever/launch/clever.launch @@ -1,5 +1,6 @@ + @@ -13,6 +14,7 @@ + diff --git a/clever/launch/mavros.launch b/clever/launch/mavros.launch index 03cc583e..2eb2d1b3 100644 --- a/clever/launch/mavros.launch +++ b/clever/launch/mavros.launch @@ -1,5 +1,6 @@ + @@ -10,6 +11,9 @@ + + + From 870bc8ba43679273ea8ce491165932d7e6f97593 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Fri, 17 Nov 2017 05:24:43 +0300 Subject: [PATCH 026/149] ros_lib folder to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..dbe405b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/deploy/ros_lib/ From 75f70c0150fa02eb9e86833a9a5f1f28a016fce2 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Fri, 17 Nov 2017 05:42:12 +0300 Subject: [PATCH 027/149] Link to Clever book --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index a8f8878a..4c1165a0 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,11 @@ Пакет программ и библиотек для Клевера. +Основная документация +--------------------- + +https://copterexpress.gitbooks.io/clever/content/ + Установка --------- From e5c5352ff84957814650400951c4245ceb402aa3 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Fri, 17 Nov 2017 05:42:40 +0300 Subject: [PATCH 028/149] Fix in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4c1165a0..bc11787a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# clever_bundle +# Clever Пакет программ и библиотек для Клевера. From e7249f86e76492407d2cfe1cb2c65a216424598c Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Fri, 17 Nov 2017 16:46:28 +0300 Subject: [PATCH 029/149] New version of simple_offboard node --- clever/CMakeLists.txt | 33 ++- clever/launch/clever.launch | 4 +- clever/requirements.txt | 1 + clever/src/global_local.py | 36 +++ clever/src/simple_offboard.py | 301 ++++++++++++++++++++++++ clever/src/util.py | 28 +++ clever/srv/SetAttitude.srv | 9 + clever/srv/SetAttitudeYawRate.srv | 7 + clever/srv/SetPosition.srv | 9 + clever/srv/SetPositionGlobal.srv | 9 + clever/srv/SetPositionGlobalYawRate.srv | 9 + clever/srv/SetPositionYawRate.srv | 9 + clever/srv/SetRates.srv | 7 + clever/srv/SetRatesYaw.srv | 9 + clever/srv/SetVelocity.srv | 9 + clever/srv/SetVelocityYawRate.srv | 9 + 16 files changed, 477 insertions(+), 12 deletions(-) create mode 100644 clever/src/global_local.py create mode 100644 clever/src/simple_offboard.py create mode 100644 clever/src/util.py create mode 100644 clever/srv/SetAttitude.srv create mode 100644 clever/srv/SetAttitudeYawRate.srv create mode 100644 clever/srv/SetPosition.srv create mode 100644 clever/srv/SetPositionGlobal.srv create mode 100644 clever/srv/SetPositionGlobalYawRate.srv create mode 100644 clever/srv/SetPositionYawRate.srv create mode 100644 clever/srv/SetRates.srv create mode 100644 clever/srv/SetRatesYaw.srv create mode 100644 clever/srv/SetVelocity.srv create mode 100644 clever/srv/SetVelocityYawRate.srv diff --git a/clever/CMakeLists.txt b/clever/CMakeLists.txt index b3cb2aba..c13ff221 100644 --- a/clever/CMakeLists.txt +++ b/clever/CMakeLists.txt @@ -7,7 +7,12 @@ project(clever) ## Find catkin macros and libraries ## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz) ## is used, also find other catkin packages -find_package(catkin REQUIRED) +find_package(catkin REQUIRED COMPONENTS + rospy + std_msgs + message_generation +) + ## System dependencies are found with CMake's conventions # find_package(Boost REQUIRED COMPONENTS system) @@ -50,11 +55,19 @@ find_package(catkin REQUIRED) # ) ## Generate services in the 'srv' folder -# add_service_files( -# FILES -# Service1.srv -# Service2.srv -# ) +add_service_files( + FILES + SetPosition.srv + SetPositionYawRate.srv + SetPositionGlobal.srv + SetPositionGlobalYawRate.srv + SetVelocity.srv + SetVelocityYawRate.srv + SetAttitude.srv + SetAttitudeYawRate.srv + SetRatesYaw.srv + SetRates.srv +) ## Generate actions in the 'action' folder # add_action_files( @@ -64,10 +77,10 @@ find_package(catkin REQUIRED) # ) ## Generate added messages and services with any dependencies listed here -# generate_messages( -# DEPENDENCIES -# std_msgs # Or other packages containing msgs -# ) +generate_messages( + DEPENDENCIES + std_msgs # Or other packages containing msgs +) ################################################ ## Declare ROS dynamic reconfigure parameters ## diff --git a/clever/launch/clever.launch b/clever/launch/clever.launch index 011db8e4..94ba7954 100644 --- a/clever/launch/clever.launch +++ b/clever/launch/clever.launch @@ -27,8 +27,8 @@ - - + + diff --git a/clever/requirements.txt b/clever/requirements.txt index 484d3c57..6cb6a548 100644 --- a/clever/requirements.txt +++ b/clever/requirements.txt @@ -1 +1,2 @@ flask==0.12.2 +geopy==1.11.0 diff --git a/clever/src/global_local.py b/clever/src/global_local.py new file mode 100644 index 00000000..a4f8f047 --- /dev/null +++ b/clever/src/global_local.py @@ -0,0 +1,36 @@ +import rospy +import math +import geopy +from geometry_msgs.msg import PoseStamped +from geopy.distance import VincentyDistance, vincenty +from sensor_msgs.msg import NavSatFix + + +def global_to_local(lat, lon): + # TODO: refactor + + position_global = rospy.wait_for_message('mavros/global_position/global', NavSatFix, timeout=5) + pose = rospy.wait_for_message('mavros/local_position/pose', PoseStamped, timeout=5) + + d = math.hypot(pose.pose.position.x, pose.pose.position.y) + + bearing = math.degrees(math.atan2(-pose.pose.position.x, -pose.pose.position.y)) + if bearing < 0: + bearing += 360 + + cur = geopy.Point(position_global.latitude, position_global.longitude) + origin = VincentyDistance(meters=d).destination(cur, bearing) + + _origin = origin.latitude, origin.longitude + olat_tlon = origin.latitude, lon + tlat_olon = lat, origin.longitude + + N = vincenty(_origin, tlat_olon) + if lat < origin.latitude: + N = -N + + E = vincenty(_origin, olat_tlon) + if lon < origin.longitude: + E = -E + + return E.meters, N.meters diff --git a/clever/src/simple_offboard.py b/clever/src/simple_offboard.py new file mode 100644 index 00000000..c091c068 --- /dev/null +++ b/clever/src/simple_offboard.py @@ -0,0 +1,301 @@ +#!/usr/bin/env python +from __future__ import division + +import rospy +from geometry_msgs.msg import TransformStamped, PoseStamped, Point, Vector3, Vector3Stamped +import tf2_ros +import tf2_geometry_msgs +from mavros_msgs.msg import PositionTarget, AttitudeTarget, State +from mavros_msgs.srv import CommandBool, SetMode +from threading import Lock +import math + +from global_local import global_to_local +from util import euler_from_orientation, vector3_from_point, orientation_from_euler +from std_srvs.srv import Trigger +from clever import srv + + +rospy.init_node('simple_offboard') + + +# TF2 stuff +tf_broadcaster = tf2_ros.TransformBroadcaster() +static_tf_broadcaster = tf2_ros.StaticTransformBroadcaster() + +tf_buffer = tf2_ros.Buffer() +tf_listener = tf2_ros.TransformListener(tf_buffer) + + +def init_fcu_horiz(): + # `fcu_horiz` frame publishing + + tr = TransformStamped() + tr.header.frame_id = 'local_origin' + tr.child_frame_id = 'fcu_horiz' + + def update_pose(data): + tr.header.stamp = data.header.stamp + tr.transform.translation = vector3_from_point(data.pose.position) + yaw = euler_from_orientation(data.pose.orientation)[2] + tr.transform.rotation = orientation_from_euler(0, 0, yaw) + tf_broadcaster.sendTransform(tr) + + rospy.Subscriber('/mavros/local_position/pose', PoseStamped, update_pose) + + +init_fcu_horiz() + + +position_pub = rospy.Publisher('/mavros/setpoint_raw/local', PositionTarget, queue_size=1) +attitude_pub = rospy.Publisher('/mavros/setpoint_raw/attitude', AttitudeTarget, queue_size=1) +arming = rospy.ServiceProxy('/mavros/cmd/arming', CommandBool) +set_mode = rospy.ServiceProxy('/mavros/set_mode', SetMode) + + +state = None + + +def state_update(data): + global state + state = data + + +rospy.Subscriber('/mavros/state', State, state_update) + + +AUTO_OFFBOARD = rospy.get_param('~auto_offboard', True) +AUTO_ARM = AUTO_OFFBOARD and rospy.get_param('~auto_arm', True) +OFFBOARD_TIMEOUT = rospy.Duration(rospy.get_param('~offboard_timeout', 3)) +ARM_TIMEOUT = rospy.Duration(rospy.get_param('~arm_timeout', 5)) +TRANSFORM_TIMEOUT = rospy.Duration(rospy.get_param('~transform_timeout', 3)) +SETPOINT_RATE = rospy.get_param('~setpoint_rate', 50) + + +def offboard_and_arm(): + if AUTO_OFFBOARD and state.mode != 'OFFBOARD': + rospy.sleep(.3) + rospy.loginfo('Switch mode to OFFBOARD') + res = set_mode(base_mode=0, custom_mode='OFFBOARD') + + start = rospy.get_rostime() + while True: + if state.mode == 'OFFBOARD': + break + if rospy.get_rostime() - start > OFFBOARD_TIMEOUT: + raise Exception('OFFBOARD request timed out') + + if AUTO_ARM and not state.armed: + rospy.loginfo('Arming') + res = arming(True) + + start = rospy.get_rostime() + while True: + if state.armed: + return True + + if rospy.get_rostime() - start > ARM_TIMEOUT: + raise Exception('Arming timed out') + + +ps = PoseStamped() +vs = Vector3Stamped() + + +def get_publisher_and_message(req, stamp): + ps.header.stamp = stamp + vs.header.stamp = stamp + + if isinstance(req, srv.SetPositionRequest): + ps.header.frame_id = req.frame_id or 'local_origin' + ps.pose.position = Point(req.x, req.y, req.z) + ps.pose.orientation = orientation_from_euler(0, 0, req.yaw) + pose_local = tf_buffer.transform(ps, 'local_origin', TRANSFORM_TIMEOUT) + + msg = PositionTarget(coordinate_frame=PositionTarget.FRAME_LOCAL_NED, + type_mask=PositionTarget.IGNORE_VX + PositionTarget.IGNORE_VY + PositionTarget.IGNORE_VZ + + PositionTarget.IGNORE_AFX + PositionTarget.IGNORE_AFY + PositionTarget.IGNORE_AFZ + + PositionTarget.IGNORE_YAW_RATE, + position=pose_local.pose.position, + yaw=euler_from_orientation(pose_local.pose.orientation)[2] - math.pi / 2) + return position_pub, msg + + elif isinstance(req, srv.SetPositionYawRateRequest): + ps.header.frame_id = req.frame_id or 'local_origin' + ps.pose.position = Point(req.x, req.y, req.z) + pose_local = tf_buffer.transform(ps, 'local_origin', TRANSFORM_TIMEOUT) + msg = PositionTarget(coordinate_frame=PositionTarget.FRAME_LOCAL_NED, + type_mask=PositionTarget.IGNORE_VX + PositionTarget.IGNORE_VY + PositionTarget.IGNORE_VZ + + PositionTarget.IGNORE_AFX + PositionTarget.IGNORE_AFY + PositionTarget.IGNORE_AFZ + + PositionTarget.IGNORE_YAW, + position=pose_local.pose.position, + yaw_rate=req.yaw_rate) + return position_pub, msg + + elif isinstance(req, srv.SetPositionGlobalRequest): + x, y = global_to_local(req.lat, req.lon) + + ps.header.frame_id = req.frame_id or 'local_origin' + ps.pose.position = Point(0, 0, req.z) + ps.pose.orientation = orientation_from_euler(0, 0, req.yaw) + pose_local = tf_buffer.transform(ps, 'local_origin', TRANSFORM_TIMEOUT) + pose_local.pose.position.x = x + pose_local.pose.position.y = y + + msg = PositionTarget(coordinate_frame=PositionTarget.FRAME_LOCAL_NED, + type_mask=PositionTarget.IGNORE_VX + PositionTarget.IGNORE_VY + PositionTarget.IGNORE_VZ + + PositionTarget.IGNORE_AFX + PositionTarget.IGNORE_AFY + PositionTarget.IGNORE_AFZ + + PositionTarget.IGNORE_YAW_RATE, + position=pose_local.pose.position, + yaw=euler_from_orientation(pose_local.pose.orientation)[2] - math.pi / 2) + return position_pub, msg + + elif isinstance(req, srv.SetPositionGlobalYawRateRequest): + x, y = global_to_local(req.lat, req.lon) + + ps.header.frame_id = req.frame_id or 'local_origin' + ps.pose.position = Point(0, 0, req.z) + pose_local = tf_buffer.transform(ps, 'local_origin', TRANSFORM_TIMEOUT) + pose_local.pose.position.x = x + pose_local.pose.position.y = y + + msg = PositionTarget(coordinate_frame=PositionTarget.FRAME_LOCAL_NED, + type_mask=PositionTarget.IGNORE_VX + PositionTarget.IGNORE_VY + PositionTarget.IGNORE_VZ + + PositionTarget.IGNORE_AFX + PositionTarget.IGNORE_AFY + PositionTarget.IGNORE_AFZ + + PositionTarget.IGNORE_YAW, + position=pose_local.pose.position, + yaw_rate=req.yaw_rate) + return position_pub, msg + + elif isinstance(req, srv.SetVelocityRequest): + vs.vector = Vector3(req.vx, req.vy, req.vz) + vs.header.frame_id = req.frame_id or 'local_origin' + ps.header.frame_id = req.frame_id or 'local_origin' + ps.pose.orientation = orientation_from_euler(0, 0, req.yaw) + pose_local = tf_buffer.transform(ps, 'local_origin', TRANSFORM_TIMEOUT) + vector_local = tf_buffer.transform(vs, 'local_origin', TRANSFORM_TIMEOUT) + msg = PositionTarget(coordinate_frame=PositionTarget.FRAME_LOCAL_NED, + type_mask=PositionTarget.IGNORE_PX + PositionTarget.IGNORE_PY + PositionTarget.IGNORE_PZ + + PositionTarget.IGNORE_AFX + PositionTarget.IGNORE_AFY + PositionTarget.IGNORE_AFZ + + PositionTarget.IGNORE_YAW_RATE, + velocity=vector_local.vector, + yaw=euler_from_orientation(pose_local.pose.orientation)[2] - math.pi / 2) + return position_pub, msg + + elif isinstance(req, srv.SetVelocityYawRateRequest): + vs.vector = Vector3(req.vx, req.vy, req.vz) + vs.header.frame_id = req.frame_id or 'local_origin' + vector_local = tf_buffer.transform(vs, 'local_origin', TRANSFORM_TIMEOUT) + msg = PositionTarget(coordinate_frame=PositionTarget.FRAME_LOCAL_NED, + type_mask=PositionTarget.IGNORE_PX + PositionTarget.IGNORE_PY + PositionTarget.IGNORE_PZ + + PositionTarget.IGNORE_AFX + PositionTarget.IGNORE_AFY + PositionTarget.IGNORE_AFZ + + PositionTarget.IGNORE_YAW, + velocity=vector_local.vector, + yaw_rate=req.yaw_rate) + return position_pub, msg + + elif isinstance(req, srv.SetAttitudeRequest): + ps.header.frame_id = req.frame_id or 'local_origin' + ps.pose.orientation = orientation_from_euler(req.roll, req.pitch, req.yaw) + pose_local = tf_buffer.transform(ps, 'local_origin', TRANSFORM_TIMEOUT) + msg = AttitudeTarget(orientation=pose_local.pose.orientation, + thrust=req.thrust, + type_mask=AttitudeTarget.IGNORE_YAW_RATE + AttitudeTarget.IGNORE_PITCH_RATE + + AttitudeTarget.IGNORE_ROLL_RATE) + return attitude_pub, msg + + elif isinstance(req, srv.SetAttitudeYawRateRequest): + msg = AttitudeTarget(orientation=orientation_from_euler(req.roll, req.pitch, 0), + thrust=req.thrust, + type_mask=AttitudeTarget.IGNORE_PITCH_RATE + AttitudeTarget.IGNORE_ROLL_RATE) + msg.body_rate.z = req.yaw_rate + return attitude_pub, msg + + elif isinstance(req, srv.SetRatesYawRequest): + ps.header.frame_id = req.frame_id or 'local_origin' + ps.pose.orientation = orientation_from_euler(0, 0, req.yaw) + pose_local = tf_buffer.transform(ps, 'local_origin', TRANSFORM_TIMEOUT) + msg = AttitudeTarget(orientation=pose_local.pose.orientation, + thrust=req.thrust, + type_mask=AttitudeTarget.IGNORE_YAW_RATE, + body_rate=Vector3(req.roll_rate, req.pitch_rate, 0)) + return attitude_pub, msg + + elif isinstance(req, srv.SetRatesRequest): + msg = AttitudeTarget(thrust=req.thrust, + type_mask=AttitudeTarget.IGNORE_ATTITUDE, + body_rate=Vector3(req.roll_rate, req.pitch_rate, req.yaw_rate)) + return attitude_pub, msg + + +current_pub = None +current_msg = None +current_req = None +handle_lock = Lock() + + +def handle(req): + global current_pub, current_msg, current_req + with handle_lock: + try: + stamp = rospy.get_rostime() + current_pub, current_msg = get_publisher_and_message(req, stamp) + rospy.loginfo('Topic: %s, message: %s', current_pub.name, current_msg) + + current_msg.header.stamp = stamp + current_pub.publish(current_msg) + + offboard_and_arm() + return {'success': True} + + except Exception as e: + rospy.logerr(str(e)) + return {'success': False, 'message': str(e)} + + +def release(req): + global current_pub + current_pub = None + rospy.loginfo('simple_offboard: release') + return {'success': True} + + +rospy.Service('set_position', srv.SetPosition, handle) +rospy.Service('set_position/yaw_rate', srv.SetPositionYawRate, handle) +rospy.Service('set_position_global', srv.SetPositionGlobal, handle) +rospy.Service('set_position_global/yaw_rate', srv.SetPositionGlobalYawRate, handle) +rospy.Service('set_velocity', srv.SetVelocity, handle) +rospy.Service('set_velocity/yaw_rate', srv.SetVelocityYawRate, handle) +rospy.Service('set_attitude', srv.SetAttitude, handle) +rospy.Service('set_attitude/yaw_rate', srv.SetAttitudeYawRate, handle) +rospy.Service('set_rates', srv.SetRates, handle) +rospy.Service('set_rates/yaw', srv.SetRatesYaw, handle) +rospy.Service('release', Trigger, release) + + +rospy.loginfo('simple_offboard inited') + + +def start_loop(): + global current_pub, current_msg, current_req + r = rospy.Rate(SETPOINT_RATE) + + while not rospy.is_shutdown(): + with handle_lock: + if current_pub is not None: + try: + stamp = rospy.get_rostime() + + if getattr(current_req, 'update_frame', False): + current_pub, current_msg = get_publisher_and_message(current_req, stamp) + + current_msg.header.stamp = stamp + current_pub.publish(current_msg) + + except Exception as e: + rospy.logwarn_throttle(10, str(e)) + + r.sleep() + + +start_loop() diff --git a/clever/src/util.py b/clever/src/util.py new file mode 100644 index 00000000..eafa72fd --- /dev/null +++ b/clever/src/util.py @@ -0,0 +1,28 @@ +from geometry_msgs.msg import Quaternion, Vector3, Point +import tf.transformations as t + + +def orientation_from_quaternion(q): + return Quaternion(*q) + + +def orientation_from_euler(roll, pitch, yaw): + q = t.quaternion_from_euler(roll, pitch, yaw) + return orientation_from_quaternion(q) + + +def quaternion_from_orientation(o): + return o.x, o.y, o.z, o.w + + +def euler_from_orientation(o): + q = quaternion_from_orientation(o) + return t.euler_from_quaternion(q) + + +def vector3_from_point(p): + return Vector3(p.x, p.y, p.z) + + +def point_from_vector3(v): + return Point(v.x, v.y, v.z) diff --git a/clever/srv/SetAttitude.srv b/clever/srv/SetAttitude.srv new file mode 100644 index 00000000..9c41fff9 --- /dev/null +++ b/clever/srv/SetAttitude.srv @@ -0,0 +1,9 @@ +float32 pitch +float32 roll +float32 yaw +float32 thrust +string frame_id +bool update_frame +--- +bool success +string message diff --git a/clever/srv/SetAttitudeYawRate.srv b/clever/srv/SetAttitudeYawRate.srv new file mode 100644 index 00000000..80e68a6a --- /dev/null +++ b/clever/srv/SetAttitudeYawRate.srv @@ -0,0 +1,7 @@ +float32 roll +float32 pitch +float32 yaw_rate +float32 thrust +--- +bool success +string message diff --git a/clever/srv/SetPosition.srv b/clever/srv/SetPosition.srv new file mode 100644 index 00000000..53e375ed --- /dev/null +++ b/clever/srv/SetPosition.srv @@ -0,0 +1,9 @@ +float32 x +float32 y +float32 z +float32 yaw +string frame_id +bool update_frame +--- +bool success +string message diff --git a/clever/srv/SetPositionGlobal.srv b/clever/srv/SetPositionGlobal.srv new file mode 100644 index 00000000..4bbdfc95 --- /dev/null +++ b/clever/srv/SetPositionGlobal.srv @@ -0,0 +1,9 @@ +float32 lat +float32 lon +float32 z +float32 yaw +string frame_id +bool update_frame +--- +bool success +string message diff --git a/clever/srv/SetPositionGlobalYawRate.srv b/clever/srv/SetPositionGlobalYawRate.srv new file mode 100644 index 00000000..a7959e04 --- /dev/null +++ b/clever/srv/SetPositionGlobalYawRate.srv @@ -0,0 +1,9 @@ +float32 lat +float32 lon +float32 z +float32 yaw_rate +string frame_id +bool update_frame +--- +bool success +string message diff --git a/clever/srv/SetPositionYawRate.srv b/clever/srv/SetPositionYawRate.srv new file mode 100644 index 00000000..76feda1f --- /dev/null +++ b/clever/srv/SetPositionYawRate.srv @@ -0,0 +1,9 @@ +float32 x +float32 y +float32 z +float32 yaw_rate +string frame_id +bool update_frame +--- +bool success +string message diff --git a/clever/srv/SetRates.srv b/clever/srv/SetRates.srv new file mode 100644 index 00000000..7e7c1cb1 --- /dev/null +++ b/clever/srv/SetRates.srv @@ -0,0 +1,7 @@ +float32 pitch_rate +float32 roll_rate +float32 yaw_rate +float32 thrust +--- +bool success +string message diff --git a/clever/srv/SetRatesYaw.srv b/clever/srv/SetRatesYaw.srv new file mode 100644 index 00000000..fb9dbcc3 --- /dev/null +++ b/clever/srv/SetRatesYaw.srv @@ -0,0 +1,9 @@ +float32 pitch_rate +float32 roll_rate +float32 yaw +float32 thrust +string frame_id +bool update_frame +--- +bool success +string message diff --git a/clever/srv/SetVelocity.srv b/clever/srv/SetVelocity.srv new file mode 100644 index 00000000..88efaaa2 --- /dev/null +++ b/clever/srv/SetVelocity.srv @@ -0,0 +1,9 @@ +float32 vx +float32 vy +float32 vz +float32 yaw +string frame_id +bool update_frame +--- +bool success +string message diff --git a/clever/srv/SetVelocityYawRate.srv b/clever/srv/SetVelocityYawRate.srv new file mode 100644 index 00000000..965bdf68 --- /dev/null +++ b/clever/srv/SetVelocityYawRate.srv @@ -0,0 +1,9 @@ +float32 vx +float32 vy +float32 vz +float32 yaw_rate +string frame_id +bool update_frame +--- +bool success +string message From 009cfde319190e33399646effeec53d6dc758533 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Fri, 17 Nov 2017 16:46:42 +0300 Subject: [PATCH 030/149] Launch file for sitl --- clever/src/sitl.launch | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 clever/src/sitl.launch diff --git a/clever/src/sitl.launch b/clever/src/sitl.launch new file mode 100644 index 00000000..90a27ac9 --- /dev/null +++ b/clever/src/sitl.launch @@ -0,0 +1,13 @@ + + + + + + + + + + + + + From 920c309226e0ed527530eb02e39d66ceeb8ede66 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Fri, 17 Nov 2017 22:32:00 +0300 Subject: [PATCH 031/149] Move sitl.launch --- clever/{src => launch}/sitl.launch | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename clever/{src => launch}/sitl.launch (100%) diff --git a/clever/src/sitl.launch b/clever/launch/sitl.launch similarity index 100% rename from clever/src/sitl.launch rename to clever/launch/sitl.launch From 12de95bb657ffdfdfdc17cf61e96303c8904d27b Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Fri, 17 Nov 2017 22:40:01 +0300 Subject: [PATCH 032/149] =?UTF-8?q?=E2=80=98rosbridge=E2=80=99=20sitl.laun?= =?UTF-8?q?ch=20argument?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- clever/launch/sitl.launch | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clever/launch/sitl.launch b/clever/launch/sitl.launch index 90a27ac9..27cb2055 100644 --- a/clever/launch/sitl.launch +++ b/clever/launch/sitl.launch @@ -1,6 +1,7 @@ + @@ -9,5 +10,6 @@ + From 6b4777063bbe2609ef552f0571eb8b3198e044a0 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Fri, 17 Nov 2017 23:31:40 +0300 Subject: [PATCH 033/149] +x for simple_offboard.py --- clever/src/simple_offboard.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 clever/src/simple_offboard.py diff --git a/clever/src/simple_offboard.py b/clever/src/simple_offboard.py old mode 100644 new mode 100755 From 8cd1281382f2a37b6e624fb53b8d189fef1368fa Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Sun, 26 Nov 2017 03:23:27 +0300 Subject: [PATCH 034/149] Rename bottom camera frame from bottom_camera to bottom_camera_optical --- clever/launch/bottom_camera.launch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clever/launch/bottom_camera.launch b/clever/launch/bottom_camera.launch index 26f4fc5c..bfcb9dda 100644 --- a/clever/launch/bottom_camera.launch +++ b/clever/launch/bottom_camera.launch @@ -2,7 +2,7 @@ - + From 9a15094b314848aee9c4bbe5dc5114cc3eb04904 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Sun, 26 Nov 2017 03:23:37 +0300 Subject: [PATCH 035/149] Default device for FPV camera --- clever/launch/fpv_camera.launch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clever/launch/fpv_camera.launch b/clever/launch/fpv_camera.launch index 359ef14f..399d403d 100644 --- a/clever/launch/fpv_camera.launch +++ b/clever/launch/fpv_camera.launch @@ -1,5 +1,5 @@ - + From bb081f9d8518894020fad53bc790111e2c0cc1de Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Sun, 26 Nov 2017 03:23:49 +0300 Subject: [PATCH 036/149] =?UTF-8?q?output=3D=C2=ABscreen=C2=BB=20for=20sim?= =?UTF-8?q?ple=20offboard=20service?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- clever/launch/clever.launch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clever/launch/clever.launch b/clever/launch/clever.launch index 94ba7954..ab129b56 100644 --- a/clever/launch/clever.launch +++ b/clever/launch/clever.launch @@ -28,7 +28,7 @@ - + From 53f2fcd678656c30eb39381b5050106b2c2ab68a Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Sun, 26 Nov 2017 03:26:58 +0300 Subject: [PATCH 037/149] Take offboard_and_arm out of the handle_lock + error if no FCU connection --- clever/src/simple_offboard.py | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/clever/src/simple_offboard.py b/clever/src/simple_offboard.py index c091c068..6ddd0dd7 100755 --- a/clever/src/simple_offboard.py +++ b/clever/src/simple_offboard.py @@ -236,21 +236,25 @@ handle_lock = Lock() def handle(req): global current_pub, current_msg, current_req - with handle_lock: - try: - stamp = rospy.get_rostime() - current_pub, current_msg = get_publisher_and_message(req, stamp) - rospy.loginfo('Topic: %s, message: %s', current_pub.name, current_msg) - current_msg.header.stamp = stamp - current_pub.publish(current_msg) + if not state.connected: + return {'message': 'No connection to the FCU'} - offboard_and_arm() - return {'success': True} + try: + with handle_lock: + stamp = rospy.get_rostime() + current_pub, current_msg = get_publisher_and_message(req, stamp) + rospy.loginfo('Topic: %s, message: %s', current_pub.name, current_msg) - except Exception as e: - rospy.logerr(str(e)) - return {'success': False, 'message': str(e)} + current_msg.header.stamp = stamp + current_pub.publish(current_msg) + + offboard_and_arm() + return {'success': True} + + except Exception as e: + rospy.logerr(str(e)) + return {'success': False, 'message': str(e)} def release(req): From 2c5862a3781e454a63eb7be9b3ece6e724e979bb Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Sun, 26 Nov 2017 03:29:41 +0300 Subject: [PATCH 038/149] =?UTF-8?q?get=5Ftelemetry=20service=20for=20simpl?= =?UTF-8?q?e=20accessing=20all=20copter=E2=80=99s=20telemtry?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- clever/CMakeLists.txt | 5 ++ clever/src/simple_offboard.py | 95 ++++++++++++++++++++++++++++++++++- clever/srv/GetTelemetry.srv | 22 ++++++++ 3 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 clever/srv/GetTelemetry.srv diff --git a/clever/CMakeLists.txt b/clever/CMakeLists.txt index c13ff221..2f3afaba 100644 --- a/clever/CMakeLists.txt +++ b/clever/CMakeLists.txt @@ -11,6 +11,9 @@ find_package(catkin REQUIRED COMPONENTS rospy std_msgs message_generation + geometry_msgs + sensor_msgs + geographic_msgs ) @@ -57,6 +60,7 @@ find_package(catkin REQUIRED COMPONENTS ## Generate services in the 'srv' folder add_service_files( FILES + GetTelemetry.srv SetPosition.srv SetPositionYawRate.srv SetPositionGlobal.srv @@ -80,6 +84,7 @@ add_service_files( generate_messages( DEPENDENCIES std_msgs # Or other packages containing msgs + mavros_msgs ) ################################################ diff --git a/clever/src/simple_offboard.py b/clever/src/simple_offboard.py index 6ddd0dd7..f7cf8dd3 100755 --- a/clever/src/simple_offboard.py +++ b/clever/src/simple_offboard.py @@ -2,7 +2,8 @@ from __future__ import division import rospy -from geometry_msgs.msg import TransformStamped, PoseStamped, Point, Vector3, Vector3Stamped +from geometry_msgs.msg import TransformStamped, PoseStamped, Point, Vector3, Vector3Stamped, TwistStamped +from sensor_msgs.msg import NavSatFix, BatteryState import tf2_ros import tf2_geometry_msgs from mavros_msgs.msg import PositionTarget, AttitudeTarget, State @@ -53,7 +54,26 @@ arming = rospy.ServiceProxy('/mavros/cmd/arming', CommandBool) set_mode = rospy.ServiceProxy('/mavros/set_mode', SetMode) +pose = None +global_position = None +velocity = None state = None +battery = None + + +def pose_update(data): + global pose + pose = data + + +def global_position_update(data): + global global_position + global_position = data + + +def velocity_update(data): + global velocity + velocity = data def state_update(data): @@ -61,7 +81,16 @@ def state_update(data): state = data +def battery_update(data): + global battery + battery = data + + rospy.Subscriber('/mavros/state', State, state_update) +rospy.Subscriber('/mavros/local_position/pose', PoseStamped, pose_update) +rospy.Subscriber('/mavros/local_position/velocity', TwistStamped, velocity_update) +rospy.Subscriber('/mavros/global_position/global', NavSatFix, global_position_update) +rospy.Subscriber('/mavros/battery', BatteryState, battery_update) AUTO_OFFBOARD = rospy.get_param('~auto_offboard', True) @@ -277,6 +306,70 @@ rospy.Service('set_rates/yaw', srv.SetRatesYaw, handle) rospy.Service('release', Trigger, release) +def get_telemetry(req): + res = { + 'frame_id': req.frame_id or 'local_origin', + 'x': float('nan'), + 'y': float('nan'), + 'z': float('nan'), + 'lat': float('nan'), + 'lon': float('nan'), + 'vx': float('nan'), + 'vy': float('nan'), + 'vz': float('nan'), + 'pitch': float('nan'), + 'roll': float('nan'), + 'yaw': float('nan'), + 'pitch_rate': float('nan'), + 'roll_rate': float('nan'), + 'yaw_rate': float('nan'), + 'voltage': float('nan'), + 'cell_voltage': float('nan') + } + frame_id = req.frame_id or 'local_origin' + stamp = rospy.get_rostime() + + if pose: + p = tf_buffer.transform(pose, frame_id, TRANSFORM_TIMEOUT) + res['x'] = p.pose.position.x + res['y'] = p.pose.position.y + res['z'] = p.pose.position.z + # Get yaw in the request's frame_in + _, _, res['yaw'] = euler_from_orientation(p.pose.orientation) + # Calculate pitch and roll as angles between the pose and fcu_horiz + attitude_pose = tf_buffer.transform(pose, 'fcu_horiz', TRANSFORM_TIMEOUT) + res['pitch'], res['roll'], _ = euler_from_orientation(attitude_pose.pose.orientation) + + if velocity: + v = Vector3Stamped() + v.header.stamp = velocity.header.stamp + v.header.frame_id = velocity.header.frame_id + v.vector = velocity.twist.linear + linear = tf_buffer.transform(v, frame_id, TRANSFORM_TIMEOUT) + res['vx'] = linear.vector.x + res['vy'] = linear.vector.y + res['vz'] = linear.vector.z + # TODO pitch_rate, roll_rate, yaw_rate + + if global_position and stamp - global_position.header.stamp < rospy.Duration(5): + res['lat'] = global_position.latitude + res['lon'] = global_position.longitude + + if state: + res['connected'] = state.connected + res['armed'] = state.armed + res['mode'] = state.mode + + if battery: + res['voltage'] = battery.voltage + res['cell_voltage'] = battery.cell_voltage[0] + + return res + + +rospy.Service('get_telemetry', srv.GetTelemetry, get_telemetry) + + rospy.loginfo('simple_offboard inited') diff --git a/clever/srv/GetTelemetry.srv b/clever/srv/GetTelemetry.srv new file mode 100644 index 00000000..b815ce89 --- /dev/null +++ b/clever/srv/GetTelemetry.srv @@ -0,0 +1,22 @@ +string frame_id +--- +string frame_id +bool connected +bool armed +string mode +float32 x +float32 y +float32 z +float32 lat +float32 lon +float32 vx +float32 vy +float32 vz +float32 pitch +float32 roll +float32 yaw +float32 pitch_rate +float32 roll_rate +float32 yaw_rate +float32 voltage +float32 cell_voltage From d1a4458cc785b28f40235af5d2cb52873b2109c5 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Sun, 26 Nov 2017 03:33:13 +0300 Subject: [PATCH 039/149] bottom_camera => bottom_camera_optical --- clever/launch/bottom_camera.launch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clever/launch/bottom_camera.launch b/clever/launch/bottom_camera.launch index bfcb9dda..8f26376d 100644 --- a/clever/launch/bottom_camera.launch +++ b/clever/launch/bottom_camera.launch @@ -5,8 +5,8 @@ - + From e79a88050033f2d382e9b39f953efd532dd4b6cf Mon Sep 17 00:00:00 2001 From: Smirnov Artem Date: Mon, 27 Nov 2017 20:00:18 +0300 Subject: [PATCH 040/149] Delete .gitmodules --- .gitmodules | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 .gitmodules diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 10e27f0e..00000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "marker_navigator"] - path = marker_navigator - url = https://github.com/CopterExpress/marker_navigator.git From 0a325be70b99fcc640c0d6d17ad4bfed27ac1b00 Mon Sep 17 00:00:00 2001 From: Smirnov Artem Date: Mon, 27 Nov 2017 20:13:50 +0300 Subject: [PATCH 041/149] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bc11787a..367a1369 100644 --- a/README.md +++ b/README.md @@ -27,14 +27,14 @@ catkin_make -j1 Включить сервис roscore (если он не включен): ```bash -sudo systemctl enable catkin_ws/src/clever/deploy/roscore.service +sudo systemctl enable /home/pi/catkin_ws/src/clever/deploy/roscore.service sudo systemctl start roscore ``` Включить сервис clever: ```bash -sudo systemctl enable catkin_ws/src/clever/deploy/clever.service +sudo systemctl enable /home/pi/catkin_ws/src/clever/deploy/clever.service sudo systemctl start clever ``` From af62fb95b4f647bf8c86821a4db069089bfb74fe Mon Sep 17 00:00:00 2001 From: urpylka Date: Tue, 28 Nov 2017 12:16:07 +0000 Subject: [PATCH 042/149] Add *.pyc to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index dbe405b7..960e17c6 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /deploy/ros_lib/ +*.pyc From ed6915c26a15aa058ba59dd2b167a4f22cc7a68b Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Tue, 28 Nov 2017 17:15:13 +0300 Subject: [PATCH 043/149] +x for fpv_camera --- clever/src/fpv_camera | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 clever/src/fpv_camera diff --git a/clever/src/fpv_camera b/clever/src/fpv_camera old mode 100644 new mode 100755 From c747270405c75c22d45450f58acb155dc8e7d5d6 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Tue, 28 Nov 2017 23:45:05 +0300 Subject: [PATCH 044/149] Change USB device path to /dev/ttyACM0 As it can be either /dev/serial/by-id/usb-3D_Robotics_PX4_FMU_v2.x_0-if00 or /dev/serial/by-id/usb-3D_Robotics_PX4_FMU_v4.x_0-if00 --- clever/launch/mavros.launch | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clever/launch/mavros.launch b/clever/launch/mavros.launch index 2eb2d1b3..64e508b1 100644 --- a/clever/launch/mavros.launch +++ b/clever/launch/mavros.launch @@ -8,8 +8,8 @@ - - + + From e975213a13bf8cb03355ad62d1aaeb2668ee0cb4 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 23 Nov 2017 05:59:25 +0300 Subject: [PATCH 045/149] First version of aruco_pose nodelet --- aruco_pose/CMakeLists.txt | 210 +++++++++++++++++ aruco_pose/nodelet_plugins.xml | 5 + aruco_pose/package.xml | 62 +++++ aruco_pose/src/aruco_pose.cpp | 409 +++++++++++++++++++++++++++++++++ aruco_pose/src/fix.cpp | 61 +++++ clever/src/aruco_vpe.py | 80 +++++++ 6 files changed, 827 insertions(+) create mode 100644 aruco_pose/CMakeLists.txt create mode 100644 aruco_pose/nodelet_plugins.xml create mode 100644 aruco_pose/package.xml create mode 100644 aruco_pose/src/aruco_pose.cpp create mode 100644 aruco_pose/src/fix.cpp create mode 100644 clever/src/aruco_vpe.py diff --git a/aruco_pose/CMakeLists.txt b/aruco_pose/CMakeLists.txt new file mode 100644 index 00000000..90403cf5 --- /dev/null +++ b/aruco_pose/CMakeLists.txt @@ -0,0 +1,210 @@ +cmake_minimum_required(VERSION 2.8.3) +project(aruco_pose) + +add_definitions(-std=c++11 -Wall -g) + +## Compile as C++11, supported in ROS Kinetic and newer +add_compile_options(-std=c++11) + +## Find catkin macros and libraries +## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz) +## is used, also find other catkin packages +find_package(catkin REQUIRED COMPONENTS + nodelet + pluginlib + roscpp + image_transport + cv_bridge + tf + #tf2 + #tf2_ros + #aruco_msgs +) + +## System dependencies are found with CMake's conventions +# find_package(Boost REQUIRED COMPONENTS system) + + +## Uncomment this if the package has a setup.py. This macro ensures +## modules and global scripts declared therein get installed +## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html +# catkin_python_setup() + +################################################ +## Declare ROS messages, services and actions ## +################################################ + +## To declare and build messages, services or actions from within this +## package, follow these steps: +## * Let MSG_DEP_SET be the set of packages whose message types you use in +## your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...). +## * In the file package.xml: +## * add a build_depend tag for "message_generation" +## * add a build_depend and a run_depend tag for each package in MSG_DEP_SET +## * If MSG_DEP_SET isn't empty the following dependency has been pulled in +## but can be declared for certainty nonetheless: +## * add a run_depend tag for "message_runtime" +## * In this file (CMakeLists.txt): +## * add "message_generation" and every package in MSG_DEP_SET to +## find_package(catkin REQUIRED COMPONENTS ...) +## * add "message_runtime" and every package in MSG_DEP_SET to +## catkin_package(CATKIN_DEPENDS ...) +## * uncomment the add_*_files sections below as needed +## and list every .msg/.srv/.action file to be processed +## * uncomment the generate_messages entry below +## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...) + +## Generate messages in the 'msg' folder +#add_message_files( +# FILES +# Marker.msg +# MarkerArray.msg +#) + +## Generate services in the 'srv' folder +# add_service_files( +# FILES +# Service1.srv +# Service2.srv +# ) + +## Generate actions in the 'action' folder +# add_action_files( +# FILES +# Action1.action +# Action2.action +# ) + +## Generate added messages and services with any dependencies listed here +#generate_messages( +# DEPENDENCIES +# std_msgs # Or other packages containing msgs +#) + +################################################ +## Declare ROS dynamic reconfigure parameters ## +################################################ + +## To declare and build dynamic reconfigure parameters within this +## package, follow these steps: +## * In the file package.xml: +## * add a build_depend and a run_depend tag for "dynamic_reconfigure" +## * In this file (CMakeLists.txt): +## * add "dynamic_reconfigure" to +## find_package(catkin REQUIRED COMPONENTS ...) +## * uncomment the "generate_dynamic_reconfigure_options" section below +## and list every .cfg file to be processed + +## Generate dynamic reconfigure parameters in the 'cfg' folder +# generate_dynamic_reconfigure_options( +# cfg/DynReconf1.cfg +# cfg/DynReconf2.cfg +# ) + +################################### +## catkin specific configuration ## +################################### +## The catkin_package macro generates cmake config files for your package +## Declare things to be passed to dependent projects +## INCLUDE_DIRS: uncomment this if you package contains header files +## LIBRARIES: libraries you create in this project that dependent projects also need +## CATKIN_DEPENDS: catkin_packages dependent projects also need +## DEPENDS: system dependencies of this project that dependent projects also need +catkin_package( +# INCLUDE_DIRS include + LIBRARIES aruco_pose +# CATKIN_DEPENDS other_catkin_pkg +# DEPENDS system_lib +) + +########### +## Build ## +########### + +## Specify additional locations of header files +## Your package locations should be listed before other locations +include_directories( +# include + ${catkin_INCLUDE_DIRS} +) + +## Declare a C++ library +add_library(${PROJECT_NAME} + src/aruco_pose.cpp +) + +## Add cmake target dependencies of the library +## as an example, code may need to be generated before libraries +## either from message generation or dynamic reconfigure +# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + +## Declare a C++ executable +## With catkin_make all packages are built within a single CMake context +## The recommended prefix ensures that target names across packages don't collide +# add_executable(${PROJECT_NAME}_node src/aruco_pose_node.cpp) + +## Rename C++ executable without prefix +## The above recommended prefix causes long target names, the following renames the +## target back to the shorter version for ease of user use +## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node" +# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "") + +## Add cmake target dependencies of the executable +## same as for the library above +# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + +## Specify libraries to link a library or executable target against +link_directories(/opt/ros/kinetic/lib) + +target_link_libraries(${PROJECT_NAME} + ${catkin_LIBRARIES} + "/opt/ros/kinetic/lib/libopencv_aruco3.so" # TODO: fix launch fails with .so loading +) + +############# +## Install ## +############# + +# all install targets should use catkin DESTINATION variables +# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html + +## Mark executable scripts (Python etc.) for installation + ## in contrast to setup.py, you can choose the destination +# install(PROGRAMS +# scripts/my_python_script +# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +# ) + +## Mark executables and/or libraries for installation +# install(TARGETS ${PROJECT_NAME} ${PROJECT_NAME}_node +# ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} +# LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} +# RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +# ) + +## Mark cpp header files for installation +# install(DIRECTORY include/${PROJECT_NAME}/ +# DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} +# FILES_MATCHING PATTERN "*.h" +# PATTERN ".svn" EXCLUDE +# ) + +## Mark other files for installation (e.g. launch and bag files, etc.) +# install(FILES +# # myfile1 +# # myfile2 +# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} +# ) + +############# +## Testing ## +############# + +## Add gtest based cpp test target and link libraries +# catkin_add_gtest(${PROJECT_NAME}-test test/test_aruco_pose.cpp) +# if(TARGET ${PROJECT_NAME}-test) +# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME}) +# endif() + +## Add folders to be run by python nosetests +# catkin_add_nosetests(test) diff --git a/aruco_pose/nodelet_plugins.xml b/aruco_pose/nodelet_plugins.xml new file mode 100644 index 00000000..79d5ddad --- /dev/null +++ b/aruco_pose/nodelet_plugins.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/aruco_pose/package.xml b/aruco_pose/package.xml new file mode 100644 index 00000000..b4da81c3 --- /dev/null +++ b/aruco_pose/package.xml @@ -0,0 +1,62 @@ + + + aruco_pose + 0.0.0 + ArUco maps precise pose estimation nodelet + + + + + Oleg Kalachev + + + + + + TODO + + + + + + + + + + + + + + + + + + + + + + + + + + catkin + + nodelet + roscpp + image_transport + cv_bridge + tf + + nodelet + roscpp + image_transport + cv_bridge + tf + + + + + + + + diff --git a/aruco_pose/src/aruco_pose.cpp b/aruco_pose/src/aruco_pose.cpp new file mode 100644 index 00000000..b68c1e08 --- /dev/null +++ b/aruco_pose/src/aruco_pose.cpp @@ -0,0 +1,409 @@ +#include +#include +#include +#include +#include +//#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// #include +// #include + +namespace aruco_pose { + +class ArucoPose : public nodelet::Nodelet { +// tf2_ros::TransformBroadcaster br; + tf::TransformBroadcaster br; + cv::Ptr dictionary; + cv::Ptr parameters; + cv::Ptr board; + std::string frame_id_; + image_transport::CameraSubscriber img_sub; + image_transport::Publisher img_pub; + ros::Publisher marker_pub; + ros::Publisher pose_pub; + ros::NodeHandle nh_, nh_priv_; + + virtual void onInit(); + void createBoard(); + void publishVisualizationMarkers(); + cv::Point3f getObjPointsCenter(cv::Mat objPoints); + void detect(const sensor_msgs::ImageConstPtr&, const sensor_msgs::CameraInfoConstPtr&); + void parseCameraInfo(const sensor_msgs::CameraInfoConstPtr&, cv::Mat&, cv::Mat&); + tf::Transform aruco2tf(cv::Mat rvec, cv::Mat tvec); + +public: + ArucoPose() {}; + virtual ~ArucoPose() {}; +}; + +void ArucoPose::onInit() { + ROS_INFO("Initializing aruco_pose"); + nh_ = getNodeHandle(); + nh_priv_ = getPrivateNodeHandle(); + + nh_priv_.param("frame_id", frame_id_, std::string("aruco_map")); + + dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_4X4_1000); + parameters = cv::aruco::DetectorParameters::create(); + createBoard(); + + image_transport::ImageTransport it(nh_); + img_sub = it.subscribeCamera("image", 1, &ArucoPose::detect, this); + + image_transport::ImageTransport it_priv(nh_priv_); + img_pub = it_priv.advertise("debug", 1); + + pose_pub = nh_priv_.advertise("pose", 1); + + publishVisualizationMarkers(); + + ROS_INFO("aruco_pose nodelet inited"); +} + +void ArucoPose::createBoard() +{ + std::string type; + nh_priv_.param("type", type, "gridboard"); + if (type == "gridboard") + { + ROS_INFO("Initialize gridboard"); + + int markers_x, markers_y, first_marker; + float markers_side, markers_sep; + nh_priv_.param("markers_x", markers_x, 10); + nh_priv_.param("markers_y", markers_y, 10); + nh_priv_.param("first_marker", first_marker, 0); + + if (!nh_priv_.getParam("markers_side", markers_side)) + ROS_ERROR("gridboard: required parameter ~markers_side is not set."); + + if (!nh_priv_.getParam("markers_sep", markers_sep)) + ROS_ERROR("gridboard: required parameter ~markers_sep is not set."); + + board = cv::aruco::GridBoard::create(markers_x, markers_y, markers_side, markers_sep, dictionary, first_marker); + + // Publish map image for debugging + cv::Mat map_image; + board->draw( cv::Size(2000, 2000), map_image, 0, 1); + cv::cvtColor(map_image, map_image, CV_GRAY2BGR); + + static auto map_image_pub = nh_priv_.advertise("map_image", 1, true); + cv_bridge::CvImage map_image_msg; + map_image_msg.encoding = sensor_msgs::image_encodings::BGR8; + map_image_msg.image = map_image; + map_image_pub.publish(map_image_msg.toImageMsg()); + } + else + { + ROS_ERROR("Incorrect map type '%s'", type.c_str()); + } +} + +void ArucoPose::publishVisualizationMarkers() +{ + // Create latched publisher + static auto viz_markers_pub = nh_.advertise("viz", 1, true); + visualization_msgs::MarkerArray viz; + visualization_msgs::Marker marker; + marker.header.frame_id = "world"; + marker.type = visualization_msgs::Marker::CUBE; + marker.scale.x = 1; + marker.scale.y = 1; + marker.scale.z = 0.001; + marker.color.r = 1; + marker.color.g = 1; + marker.color.b = 1; + marker.color.a = 0.9; + marker.frame_locked = true; + viz.markers.push_back(marker); + marker.type = visualization_msgs::Marker::TEXT_VIEW_FACING; + marker.scale.z = 0.3; + marker.color.r = 0; + marker.color.g = 0; + marker.color.b = 0; + marker.color.a = 0.8; + marker.text = "240"; + viz.markers.push_back(marker); + viz_markers_pub.publish(viz); +} + +cv::Point3f ArucoPose::getObjPointsCenter(cv::Mat objPoints) { + float min_x = std::numeric_limits::max(); + float max_x = std::numeric_limits::min(); + float min_y = min_x, max_y = max_x; + for (int i = 0; i < objPoints.rows; i++) { + max_x = std::max(max_x, objPoints.at(i, 0)); + max_y = std::max(max_y, objPoints.at(i, 1)); + min_x = std::min(max_x, objPoints.at(i, 0)); + min_y = std::min(max_y, objPoints.at(i, 1)); + } + cv::Point3f res((min_x + max_x) / 2, (min_y + max_y) / 2, 0); + return res; +} + +#include "fix.cpp" + +void ArucoPose::detect(const sensor_msgs::ImageConstPtr& msg, const sensor_msgs::CameraInfoConstPtr &cinfo) { + cv::Mat image = cv_bridge::toCvShare(msg, "bgr8")->image; + + std::vector markerIds; + std::vector> markerCorners; + std::vector> rejectedCandidates; + + cv::aruco::detectMarkers(image, dictionary, markerCorners, markerIds, parameters, rejectedCandidates); + + cv::Mat cameraMatrix(3, 3, CV_64F); + cv::Mat distCoeffs(8, 1, CV_64F); + parseCameraInfo(cinfo, cameraMatrix, distCoeffs); + + // std::cout << "dist " << distCoeffs << " mat " << cameraMatrix; + // std::cout << markerIds.size() << std::endl; + + // cv::Vec3d rvec, tvec; + // int valid = cv::aruco::estimatePoseBoard(markerCorners, markerIds, board, cameraMatrix, distCoeffs, rvec, tvec); + + // std::vector< cv::Vec3d > rvecs, tvecs; + //cv::aruco::estimatePoseSingleMarkers(markerCorners, 0.3362, cameraMatrix, distCoeffs, rvecs, tvecs); + // cv::aruco::estimatePoseSingleMarkers(markerCorners, 0.15, cameraMatrix, distCoeffs, rvecs, tvecs); + + + // Publish markers + // aruco_pose::MarkerArray markerArray; + // markerArray.header.frame_id = msg->header.frame_id; + // markerArray.header.stamp = msg->header.stamp; + // markerArray.markers.resize(markerIds.size()); + // for (int i = 0; i < markerIds.size(); i++) { + // markerArray.markers[i].id = markerIds[i]; + // markerArray.markers[i].pose.x = tvect[0]; + // markerArray.markers[i].pose.y = tvect[1]; + // markerArray.markers[i].pose.z = tvect[2]; + // markerArray.markers[i].header.stamp = msg->header.stamp; + // markerArray.markers[i].header.frame_id = msg->header.frame_id; + // } + // marker_pub.publish(markerArray); + + /* + for (int i = 0; i < markerIds.size(); i++) { + //if (markerIds[i] == 242) { + if (markerIds[i] == 9) { + tf::Transform transform = aruco2tf(rvecs[i], tvecs[i]); + tf::StampedTransform stampedTransform(transform, msg->header.stamp, msg->header.frame_id, frame_id); + br.sendTransform(stampedTransform); + + // geometry_msgs::TransformStamped transformStamped; + // transformStamped.header.stamp = msg->header.stamp; + // transformStamped.header.frame_id = cinfo->header.frame_id; + // transformStamped.child_frame_id = frame_id; + // transformStamped.transform = aruco2tf(rvecs[i], tvecs[i]); + // transformStamped.transform.translation = transformStamped.transform.translation.normalize(); + // br.sendTransform(transformStamped); + break; + } + } + */ + + // std::cout << "markers: "; + // for (auto const& c : markerIds) std::cout << c << ' '; + +// return; + + if (markerIds.size() > 0) { +// for (auto const& c : markerCorners) std::cout << c << ' '; +// for (auto const& c : markerIds) std::cout << c << ' '; + +// cv::aruco::drawDetectedMarkers(image, markerCorners, markerIds); + + // std::vector< cv::Vec3d > rvecs, tvecs; + // cv::aruco::estimatePoseSingleMarkers(markerCorners, 0.3362, cameraMatrix, distCoeffs, rvecs, tvecs); + // draw axis for each marker + // for(int i=0; iheader.stamp, cinfo->header.frame_id, frame_id_); + br.sendTransform(transform); + + // Publish map pose + static geometry_msgs::PoseStamped ps; + ps.header.frame_id = frame_id_; + ps.header.stamp = msg->header.stamp; + ps.pose.orientation.w = 1; + pose_pub.publish(ps); + + // Publish reference point + cv::Point3f ref = getObjPointsCenter(objPoints); + tf::Vector3 ref_vector3 = tf::Vector3(ref.x, ref.y, ref.z); + tf::Quaternion q(0, 0, 0); + static tf::StampedTransform ref_transform; + ref_transform.stamp_ = msg->header.stamp; + ref_transform.frame_id_ = frame_id_; + ref_transform.child_frame_id_ = "aruco_map_reference"; + ref_transform.setOrigin(ref_vector3); + ref_transform.setRotation(q); + br.sendTransform(ref_transform); + +// geometry_msgs::TransformStamped transformMsg; + // transform.header.stamp = msg->header.stamp; + // transform.header.frame_id = cinfo->header.frame_id; + // transform.child_frame_id = frame_id; + // transform.transform = aruco2tf(rvec, tvec); +// tf::transformStampedTFToMsg(transform, transformMsg); +// br.sendTransform(transformMsg); +// std::cout << rvec << ";" << tvec << std::endl; +// geometry_msgs::TransformStamped transformStamped; +// transformStamped.header.stamp = msg->header.stamp; +// transformStamped.header.frame_id = cinfo->header.frame_id; +// transformStamped.child_frame_id = frame_id; +// transformStamped.transform.translation.x = tvec[0]; +// transformStamped.transform.translation.y = tvec[1]; +// transformStamped.transform.translation.z = tvec[1]; +// transformStamped.transform.rotation.w = 1; +// br.sendTransform(transformStamped); + + if(img_pub.getNumSubscribers() > 0) + { + //show input with augmented information + // for(int i=0; iheader.frame_id; + out_msg.header.stamp = msg->header.stamp; + out_msg.encoding = sensor_msgs::image_encodings::BGR8; // sensor_msgs::image_encodings::RGB8; + out_msg.image = image; + img_pub.publish(out_msg.toImageMsg()); + } + } + } +} + +void ArucoPose::parseCameraInfo(const sensor_msgs::CameraInfoConstPtr &cinfo, cv::Mat &cameraMat, cv::Mat &distCoeffs) { + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j) { + cameraMat.at(i, j) = cinfo->K[3 * i + j]; + } + } + for (int k = 0; k < cinfo->D.size(); k++) { + distCoeffs.at(k) = cinfo->D[k]; + } +} + +tf::Transform ArucoPose::aruco2tf(cv::Mat rvec, cv::Mat tvec) { + + cv::Mat rot; + cv::Rodrigues(rvec, rot); + +// rot = rot.t(); // inverse rotation + //tvec = -rot * tvec; // translation of inverse + + // camPose is a 4x4 matrix with the pose of the camera in the object frame + // cv::Mat camPose = cv::Mat::eye(4, 4, R.type()); + // R.copyTo(camPose.rowRange(0, 3).colRange(0, 3)); // copies R into camPose + // tvec.copyTo(camPose.rowRange(0, 3).colRange(3, 4)); // copies tvec into camPose + + tf::Matrix3x3 tf_rot(rot.at(0,0), rot.at(0,1), rot.at(0,2), + rot.at(1,0), rot.at(1,1), rot.at(1,2), + rot.at(2,0), rot.at(2,1), rot.at(2,2)); + tf::Vector3 tf_orig(tvec.at(0,0), tvec.at(1,0), tvec.at(2,0)); + return tf::Transform(tf_rot, tf_orig); +} + +/* +tf::Transform ArucoPose::aruco2tf(cv::Vec3d rvec, cv::Vec3d tvec) { + cv::Mat rot(3, 3, CV_64FC1); + // cv::Mat Rvec64; + // rvec.convertTo(rvec, CV_64FC1); + cv::Rodrigues(rvec, rot); + cv::Mat tran64; + // tvec.convertTo(tran64, CV_64FC1); + + cv::Mat rotate_to_ros(3, 3, CV_64FC1); + rotate_to_ros.at(0,0) = 1.0; + rotate_to_ros.at(0,1) = 0.0; + rotate_to_ros.at(0,2) = 0.0; + rotate_to_ros.at(1,0) = 0.0; + rotate_to_ros.at(1,1) = -1.0; + rotate_to_ros.at(1,2) = 0.0; + rotate_to_ros.at(2,0) = 0.0; + rotate_to_ros.at(2,1) = 0.0; + rotate_to_ros.at(2,2) = -1.0; + + rot = rot*rotate_to_ros.t(); + + tf::Matrix3x3 tf_rot(rot.at(0,0), rot.at(0,1), rot.at(0,2), + rot.at(1,0), rot.at(1,1), rot.at(1,2), + rot.at(2,0), rot.at(2,1), rot.at(2,2)); + + tf::Vector3 tf_orig(tvec[0], tvec[1], tvec[2]); + + + return tf::Transform(tf_rot, tf_orig); +} +*/ + +// tf::Transform ArucoPose::aruco2tf(cv::Vec3d rvec, cv::Vec3d tvec) { +// /* Code it based on https://github.com/Sahloul/ar_sys/blob/master/src/utils.cpp#L44 */ +// /* TODO: rewrite */ + +// cv::Mat rot(3, 3, CV_64FC1); +// cv::Rodrigues(rvec, rot); + +// cv::Mat rotate_to_sys(3, 3, CV_64FC1); +// /** +// /* Fixed the rotation to meet the ROS system +// /* Doing a basic rotation around X with theta=PI +// /* By Sahloul +// /* See http://en.wikipedia.org/wiki/Rotation_matrix for details +// */ + +// // 1 0 0 +// // 0 -1 0 +// // 0 0 -1 + +// rotate_to_sys.at(0,0) = 1.0; +// rotate_to_sys.at(0,1) = 0.0; +// rotate_to_sys.at(0,2) = 0.0; +// rotate_to_sys.at(1,0) = 0.0; +// rotate_to_sys.at(1,1) = -1.0; +// rotate_to_sys.at(1,2) = 0.0; +// rotate_to_sys.at(2,0) = 0.0; +// rotate_to_sys.at(2,1) = 0.0; +// rotate_to_sys.at(2,2) = -1.0; + +// rot = rot * rotate_to_sys.t(); + + +// tf::Matrix3x3 tf_rot(rot.at(0,0), rot.at(0,1), rot.at(0,2), +// rot.at(1,0), rot.at(1,1), rot.at(1,2), +// rot.at(2,0), rot.at(2,1), rot.at(2,2)); + +// tf::Vector3 tf_orig(tvec[0], tvec[1], tvec[2]); + +// tf::Transform tft(tf_rot, tf_orig); +// return tft; +// } + +PLUGINLIB_EXPORT_CLASS(ArucoPose, nodelet::Nodelet) + +} + diff --git a/aruco_pose/src/fix.cpp b/aruco_pose/src/fix.cpp new file mode 100644 index 00000000..294ff569 --- /dev/null +++ b/aruco_pose/src/fix.cpp @@ -0,0 +1,61 @@ +using namespace cv; + +// Temporal fix! +// TODO: remove +// fix strange bug in our OpenCV version + +void _getBoardObjectAndImagePoints(const Ptr &board, InputArrayOfArrays detectedCorners, + InputArray detectedIds, OutputArray objPoints, OutputArray imgPoints) { + + CV_Assert(board->ids.size() == board->objPoints.size()); + CV_Assert(detectedIds.total() == detectedCorners.total()); + + size_t nDetectedMarkers = detectedIds.total(); + + std::vector< Point3f > objPnts; + objPnts.reserve(nDetectedMarkers); + + std::vector< Point2f > imgPnts; + imgPnts.reserve(nDetectedMarkers); + + // look for detected markers that belong to the board and get their information + for(unsigned int i = 0; i < nDetectedMarkers; i++) { + int currentId = detectedIds.getMat().ptr< int >(0)[i]; + for(unsigned int j = 0; j < board->ids.size(); j++) { + if(currentId == board->ids[j]) { + for(int p = 0; p < 4; p++) { + objPnts.push_back(board->objPoints[j][p]); + imgPnts.push_back(detectedCorners.getMat(i).ptr< Point2f >(0)[p]); + } + } + } + } + + // create output + Mat(objPnts).copyTo(objPoints); + Mat(imgPnts).copyTo(imgPoints); +} + +int _estimatePoseBoard(InputArrayOfArrays _corners, InputArray _ids, const Ptr &board, + InputArray _cameraMatrix, InputArray _distCoeffs, OutputArray _rvec, + OutputArray _tvec, bool useExtrinsicGuess, Mat &objPoints) { + + CV_Assert(_corners.total() == _ids.total()); + + // get object and image points for the solvePnP function + Mat /*objPoints, */imgPoints; + _getBoardObjectAndImagePoints(board, _corners, _ids, objPoints, imgPoints); + + CV_Assert(imgPoints.total() == objPoints.total()); + + if(objPoints.total() == 0) // 0 of the detected markers in board + return 0; + +// std::cout << "objPoints: " << objPoints << std::endl; +// std::cout << "imgPoints: " << imgPoints << std::endl; + + solvePnP(objPoints, imgPoints, _cameraMatrix, _distCoeffs, _rvec, _tvec, useExtrinsicGuess); + + // divide by four since all the four corners are concatenated in the array for each marker + return (int)objPoints.total() / 4; +} diff --git a/clever/src/aruco_vpe.py b/clever/src/aruco_vpe.py new file mode 100644 index 00000000..198bb846 --- /dev/null +++ b/clever/src/aruco_vpe.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python + +import rospy +from geometry_msgs.msg import PoseStamped, PointStamped, Quaternion +import tf2_ros +from tf2_geometry_msgs import do_transform_pose +import tf.transformations + +from util import orientation_from_euler, euler_from_orientation + + +rospy.init_node('aruco_vpe') + + +LOOKUP_TIMEOUT = rospy.Duration(.1) +CAMERA_FRAME_ID = rospy.get_param('~camera_frame_id', 'bottom_camera_optical') + + +# TF2 stuff +tf_broadcaster = tf2_ros.TransformBroadcaster() +static_tf_broadcaster = tf2_ros.StaticTransformBroadcaster() + +tf_buffer = tf2_ros.Buffer() +tf_listener = tf2_ros.TransformListener(tf_buffer) + + +vision_position_pub = rospy.Publisher('mavros/vision_pose/pose', PoseStamped, queue_size=1) +_vision_position_pub = rospy.Publisher('fake_vision_pose', PoseStamped, queue_size=1) +last_published = None + + +q = Quaternion() +q.w = 1 +ps = PoseStamped() +ps.pose.orientation = q + + +def send_transform(transform, child_frame_id): + transform.child_frame_id = child_frame_id + tf_broadcaster.sendTransform(transform) + + +def publish_vpe(pose): + global last_published + stamp = pose.header.stamp + + def lookup_transform(target_frame, source_frame): + return tf_buffer.lookup_transform(target_frame, source_frame, stamp, LOOKUP_TIMEOUT) + + # Refine aruco_map + reference_in_local_origin = lookup_transform('local_origin', 'aruco_map_reference') + roll, pitch, yaw = euler_from_orientation(reference_in_local_origin.transform.rotation) + reference_in_local_origin.transform.rotation = orientation_from_euler(0, 0, yaw) + send_transform(reference_in_local_origin, 'aruco_map_reference_horiz') + + aruco_map_in_reference = lookup_transform('aruco_map_reference', 'aruco_map_raw') + aruco_map_in_reference.header.frame_id = 'aruco_map_reference_horiz' + send_transform(aruco_map_in_reference, 'aruco_map') + + # Reset VPE + if last_published is None or stamp - last_published > rospy.Duration(2): + rospy.loginfo('Reset VPE') + aruco_map_in_local_origin = lookup_transform('local_origin', 'aruco_map') + aruco_map_in_local_origin.child_frame_id = 'vpe_origin' + static_tf_broadcaster.sendTransform(aruco_map_in_local_origin) + + # Calculate VPE + ps.header.frame_id = 'fcu_horiz' + ps.header.stamp = stamp + vpe_raw = tf_buffer.transform(ps, 'aruco_map', LOOKUP_TIMEOUT) + vpe_raw.header.frame_id = 'vpe_origin' + vpe = tf_buffer.transform(vpe_raw, 'local_origin', LOOKUP_TIMEOUT) + _vision_position_pub.publish(vpe_raw) + vision_position_pub.publish(vpe) + last_published = stamp + + +rospy.Subscriber('aruco_pose/pose', PoseStamped, publish_vpe, queue_size=1) +rospy.loginfo('aruco_vpe inited') +rospy.spin() From 13b1a79f650a0f76cfbad36a5de4998f709bb727 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Wed, 29 Nov 2017 19:20:34 +0300 Subject: [PATCH 046/149] get_telemetry service --- clever/CMakeLists.txt | 1 + clever/src/simple_offboard.py | 95 ++++++++++++++++++++++++++++++++++- clever/srv/GetTelemetry.srv | 22 ++++++++ 3 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 clever/srv/GetTelemetry.srv diff --git a/clever/CMakeLists.txt b/clever/CMakeLists.txt index c13ff221..49f2ee06 100644 --- a/clever/CMakeLists.txt +++ b/clever/CMakeLists.txt @@ -67,6 +67,7 @@ add_service_files( SetAttitudeYawRate.srv SetRatesYaw.srv SetRates.srv + GetTelemetry.srv ) ## Generate actions in the 'action' folder diff --git a/clever/src/simple_offboard.py b/clever/src/simple_offboard.py index c091c068..50032b09 100755 --- a/clever/src/simple_offboard.py +++ b/clever/src/simple_offboard.py @@ -2,7 +2,8 @@ from __future__ import division import rospy -from geometry_msgs.msg import TransformStamped, PoseStamped, Point, Vector3, Vector3Stamped +from geometry_msgs.msg import TransformStamped, PoseStamped, Point, PointStamped, Vector3, Vector3Stamped, TwistStamped, QuaternionStamped +from sensor_msgs.msg import NavSatFix, BatteryState import tf2_ros import tf2_geometry_msgs from mavros_msgs.msg import PositionTarget, AttitudeTarget, State @@ -53,7 +54,26 @@ arming = rospy.ServiceProxy('/mavros/cmd/arming', CommandBool) set_mode = rospy.ServiceProxy('/mavros/set_mode', SetMode) +pose = None +global_position = None +velocity = None state = None +battery = None + + +def pose_update(data): + global pose + pose = data + + +def global_position_update(data): + global global_position + global_position = data + + +def velocity_update(data): + global velocity + velocity = data def state_update(data): @@ -61,7 +81,16 @@ def state_update(data): state = data +def battery_update(data): + global battery + battery = data + + rospy.Subscriber('/mavros/state', State, state_update) +rospy.Subscriber('/mavros/local_position/pose', PoseStamped, pose_update) +rospy.Subscriber('/mavros/local_position/velocity', TwistStamped, velocity_update) +rospy.Subscriber('/mavros/global_position/global', NavSatFix, global_position_update) +rospy.Subscriber('/mavros/battery', BatteryState, battery_update) AUTO_OFFBOARD = rospy.get_param('~auto_offboard', True) @@ -273,6 +302,70 @@ rospy.Service('set_rates/yaw', srv.SetRatesYaw, handle) rospy.Service('release', Trigger, release) +def get_telemetry(req): + res = { + 'frame_id': req.frame_id or 'local_origin', + 'x': float('nan'), + 'y': float('nan'), + 'z': float('nan'), + 'lat': float('nan'), + 'lon': float('nan'), + 'vx': float('nan'), + 'vy': float('nan'), + 'vz': float('nan'), + 'pitch': float('nan'), + 'roll': float('nan'), + 'yaw': float('nan'), + 'pitch_rate': float('nan'), + 'roll_rate': float('nan'), + 'yaw_rate': float('nan'), + 'voltage': float('nan'), + 'cell_voltage': float('nan') + } + frame_id = req.frame_id or 'local_origin' + stamp = rospy.get_rostime() + + if pose: + p = tf_buffer.transform(pose, frame_id, TRANSFORM_TIMEOUT) + res['x'] = p.pose.position.x + res['y'] = p.pose.position.y + res['z'] = p.pose.position.z + # Get yaw in the request's frame_in + _, _, res['yaw'] = euler_from_orientation(p.pose.orientation) + # Calculate pitch and roll as angles between the pose and fcu_horiz + attitude_pose = tf_buffer.transform(pose, 'fcu_horiz', TRANSFORM_TIMEOUT) + res['pitch'], res['roll'], _ = euler_from_orientation(attitude_pose.pose.orientation) + + if velocity: + v = Vector3Stamped() + v.header.stamp = velocity.header.stamp + v.header.frame_id = velocity.header.frame_id + v.vector = velocity.twist.linear + linear = tf_buffer.transform(v, frame_id, TRANSFORM_TIMEOUT) + res['vx'] = linear.vector.x + res['vy'] = linear.vector.y + res['vz'] = linear.vector.z + # TODO pitch_rate, roll_rate, yaw_rate + + if global_position and stamp - global_position.header.stamp < rospy.Duration(5): + res['lat'] = global_position.latitude + res['lon'] = global_position.longitude + + if state: + res['connected'] = state.connected + res['armed'] = state.armed + res['mode'] = state.mode + + if battery: + res['voltage'] = battery.voltage + res['cell_voltage'] = battery.cell_voltage[0] + + return res + + +rospy.Service('get_telemetry', srv.GetTelemetry, get_telemetry) + + rospy.loginfo('simple_offboard inited') diff --git a/clever/srv/GetTelemetry.srv b/clever/srv/GetTelemetry.srv new file mode 100644 index 00000000..b815ce89 --- /dev/null +++ b/clever/srv/GetTelemetry.srv @@ -0,0 +1,22 @@ +string frame_id +--- +string frame_id +bool connected +bool armed +string mode +float32 x +float32 y +float32 z +float32 lat +float32 lon +float32 vx +float32 vy +float32 vz +float32 pitch +float32 roll +float32 yaw +float32 pitch_rate +float32 roll_rate +float32 yaw_rate +float32 voltage +float32 cell_voltage From 0c6f6c29ae5911ec7c5f58793417d770b424fc7f Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Wed, 29 Nov 2017 19:30:24 +0300 Subject: [PATCH 047/149] launch-file for aruco_pose --- clever/launch/aruco.launch | 13 +++++++++++++ clever/launch/clever.launch | 3 ++- 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 clever/launch/aruco.launch diff --git a/clever/launch/aruco.launch b/clever/launch/aruco.launch new file mode 100644 index 00000000..2c3915bb --- /dev/null +++ b/clever/launch/aruco.launch @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/clever/launch/clever.launch b/clever/launch/clever.launch index ab129b56..57352d61 100644 --- a/clever/launch/clever.launch +++ b/clever/launch/clever.launch @@ -7,6 +7,7 @@ + @@ -25,7 +26,7 @@ - + From 81d38438178a05dc5d4304e8db1497c5d7adc33e Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Wed, 29 Nov 2017 19:55:57 +0300 Subject: [PATCH 048/149] auto_arm parameter for services --- clever/CMakeLists.txt | 1 - clever/src/simple_offboard.py | 4 +++- clever/srv/SetAttitude.srv | 1 + clever/srv/SetAttitudeYawRate.srv | 1 + clever/srv/SetPosition.srv | 1 + clever/srv/SetPositionGlobal.srv | 1 + clever/srv/SetPositionGlobalYawRate.srv | 1 + clever/srv/SetPositionYawRate.srv | 1 + clever/srv/SetRates.srv | 1 + clever/srv/SetRatesYaw.srv | 1 + clever/srv/SetVelocity.srv | 1 + clever/srv/SetVelocityYawRate.srv | 1 + deploy/clever_arudino.tar.gz | Bin 164791 -> 185816 bytes 13 files changed, 13 insertions(+), 2 deletions(-) diff --git a/clever/CMakeLists.txt b/clever/CMakeLists.txt index 22ba58d9..2f3afaba 100644 --- a/clever/CMakeLists.txt +++ b/clever/CMakeLists.txt @@ -71,7 +71,6 @@ add_service_files( SetAttitudeYawRate.srv SetRatesYaw.srv SetRates.srv - GetTelemetry.srv ) ## Generate actions in the 'action' folder diff --git a/clever/src/simple_offboard.py b/clever/src/simple_offboard.py index 0e48831c..f808fe2b 100755 --- a/clever/src/simple_offboard.py +++ b/clever/src/simple_offboard.py @@ -278,7 +278,9 @@ def handle(req): current_msg.header.stamp = stamp current_pub.publish(current_msg) - offboard_and_arm() + if req.auto_offboard: + offboard_and_arm() + return {'success': True} except Exception as e: diff --git a/clever/srv/SetAttitude.srv b/clever/srv/SetAttitude.srv index 9c41fff9..05ba13db 100644 --- a/clever/srv/SetAttitude.srv +++ b/clever/srv/SetAttitude.srv @@ -4,6 +4,7 @@ float32 yaw float32 thrust string frame_id bool update_frame +bool auto_arm --- bool success string message diff --git a/clever/srv/SetAttitudeYawRate.srv b/clever/srv/SetAttitudeYawRate.srv index 80e68a6a..e914cf7e 100644 --- a/clever/srv/SetAttitudeYawRate.srv +++ b/clever/srv/SetAttitudeYawRate.srv @@ -2,6 +2,7 @@ float32 roll float32 pitch float32 yaw_rate float32 thrust +bool auto_arm --- bool success string message diff --git a/clever/srv/SetPosition.srv b/clever/srv/SetPosition.srv index 53e375ed..421c4931 100644 --- a/clever/srv/SetPosition.srv +++ b/clever/srv/SetPosition.srv @@ -4,6 +4,7 @@ float32 z float32 yaw string frame_id bool update_frame +bool auto_arm --- bool success string message diff --git a/clever/srv/SetPositionGlobal.srv b/clever/srv/SetPositionGlobal.srv index 4bbdfc95..742f4d95 100644 --- a/clever/srv/SetPositionGlobal.srv +++ b/clever/srv/SetPositionGlobal.srv @@ -4,6 +4,7 @@ float32 z float32 yaw string frame_id bool update_frame +bool auto_arm --- bool success string message diff --git a/clever/srv/SetPositionGlobalYawRate.srv b/clever/srv/SetPositionGlobalYawRate.srv index a7959e04..3fc42931 100644 --- a/clever/srv/SetPositionGlobalYawRate.srv +++ b/clever/srv/SetPositionGlobalYawRate.srv @@ -4,6 +4,7 @@ float32 z float32 yaw_rate string frame_id bool update_frame +bool auto_arm --- bool success string message diff --git a/clever/srv/SetPositionYawRate.srv b/clever/srv/SetPositionYawRate.srv index 76feda1f..419621ca 100644 --- a/clever/srv/SetPositionYawRate.srv +++ b/clever/srv/SetPositionYawRate.srv @@ -4,6 +4,7 @@ float32 z float32 yaw_rate string frame_id bool update_frame +bool auto_arm --- bool success string message diff --git a/clever/srv/SetRates.srv b/clever/srv/SetRates.srv index 7e7c1cb1..f6ebddf9 100644 --- a/clever/srv/SetRates.srv +++ b/clever/srv/SetRates.srv @@ -2,6 +2,7 @@ float32 pitch_rate float32 roll_rate float32 yaw_rate float32 thrust +bool auto_arm --- bool success string message diff --git a/clever/srv/SetRatesYaw.srv b/clever/srv/SetRatesYaw.srv index fb9dbcc3..df8950ac 100644 --- a/clever/srv/SetRatesYaw.srv +++ b/clever/srv/SetRatesYaw.srv @@ -4,6 +4,7 @@ float32 yaw float32 thrust string frame_id bool update_frame +bool auto_arm --- bool success string message diff --git a/clever/srv/SetVelocity.srv b/clever/srv/SetVelocity.srv index 88efaaa2..01b818b2 100644 --- a/clever/srv/SetVelocity.srv +++ b/clever/srv/SetVelocity.srv @@ -4,6 +4,7 @@ float32 vz float32 yaw string frame_id bool update_frame +bool auto_arm --- bool success string message diff --git a/clever/srv/SetVelocityYawRate.srv b/clever/srv/SetVelocityYawRate.srv index 965bdf68..3155644e 100644 --- a/clever/srv/SetVelocityYawRate.srv +++ b/clever/srv/SetVelocityYawRate.srv @@ -4,6 +4,7 @@ float32 vz float32 yaw_rate string frame_id bool update_frame +bool auto_arm --- bool success string message diff --git a/deploy/clever_arudino.tar.gz b/deploy/clever_arudino.tar.gz index f3b0de39177dac453f4c134bfd5765dc442fe37c..8be567f433fb4c6de385ab1cb5a76e70a105ccfe 100644 GIT binary patch literal 185816 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 lp=dkO!-4kloP9ujq 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Μ9NySEcNWVzlY` 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 Itx|yfFLfta>i_@% literal 164791 zcmZ^~Wl$Vl)HRA*a0w9H-60U1;O_435Zv9}-QC@t5S-vag9UdP+@?RC?|pCGKllDw zb*iVPt7odu-b?l&i9vv%hDX(bfIjcDb|K_W|H@nN&cOaQdXZ?gp7%=5jV}^ImBoQw zMMl@-$47|MC3Bx`R#g+-e9{lT!X3x4r4IZ(NiUNnVA|Bkzls_d5)$H~F?Ijuj`99J z(EfC?b4v&hw)KpU2kZI)=33I3`PVqVt#}x}8T)tm4-n^LgKi#&N4G;ykjI?Qt>4C;@b&^w0N<|O?a-K4SGPVy zZnU#2!8=-L)W);*+#7Dfv6kx_Zj=?cTSJoCG^TA_K`>yMv`J%KKHb3FaD;;KTU(43 zxLyJvtwjQ@Kn>v8UBP}oDU}P7Gx_GuZQsX#c%O8cF1J&R5ep?5&uxWE1K>wKuG&(f zQ!*akk8#Q^;KaV23iisbko@9V%I@~NFKFmrXnp#s*TAL0)rPx17IEy3VOyAq%d%Cw z9kLHV0u5>ZSU>|@_P0-LVfyMgZ@c2k&0m2;fG+~Ep9QPLSm);P5k{f6*U+)`Nwkx9 z?vUiyG(2G;>imwO`Ze^i*i^1#>&UxF3xeZOpf5LF=C70YS88>AF-V2dk!a)LpwE~; z>#EQ=-FLgIjeE6yWx{NtX-4Q}B!7CF6xmy&aayPx8f`F}&Sg_>gnHsc{-}H2MC$0A zO*gB^Ap7!m_SyjY@!3hx$3WRoM07TvBz=HPng8|W?1ejpIR9i8Eh^Iz_iASLOs}?R zg2NcYGrxSv^LY&uJQMJF@u;C#zuGhu= zV=MtP?QU;_J0hr(gKrty?F!uMN#&Y-TH(GfrS^i1%iF}b0(bhVVsTY|s?`1p^A_{_ zzRi$!jif<=maxRgH5|T3n%q++t$U^yS!fpF;J2;^Zh2sDsRmU_6mJ1Nj5CZ(URg>OZ=skpC*A-WQ^&%d z_5RpwYKg5ELOjuN9g4^{6T z7(U5v^S`G!(-5Pob`V!1Kh+R3&bBCWP2qIma4fT8gcqOFs$~?|o9i3Ts*Ui(|Lsc2 zl#;h#S8Nu+$)=+JbG&>31tk`bJuSTB*LQHB!SCj>{g*H^CEeC$bKEbOy5jW<)4xvp zmkZs!m6F4ihW*m25-YXLmdmDapI}?F`Muc_cR$<6 z8`TTTS^}-n7W!$Ii#5m^_=13jHnv0Vbzmhf`AW`+3m6ls-n7J1!h+?3hiX$&s)1BD zsrFY&N+s*m6?g~9m7MqoZsr(&tubX*(s+4Y?7cygUb7YQuMz`g zm1xwCRHq?yUFdDjKaGe?G!HVh#hr167JlH8F)oo+T=Y^!dSUaJgxCdj97*rsO`*;I zW@-@htZQ$2GNNi+AwGPnVHEf+SguKY${5DPuT}fh{p;X*f=wa;^)I1*DRoGKZOAm9 z^7-%bujwX7lm=+H6&dyq_69FIeMrjq@7lzOOWv3#G~kn3j9($JcYfVnUT>L#KHviS zu@$0@e8Yf-_j>`X>>=jEd1_#EF577MDSxn16a|! zfU#NM@cqE>=>1CjXFWC%2*j-1iFnxwzyd8%uZB}jaVKDpSjBU21|`(L93zR*e^;SY z4So~6(uNQLm$)4vn^A|>>wE)UJA{Ydu?BL*O6_&~V{@6YD?W{!e0Q28_sKRu@-r#smVtzJTQ#c&UGB<0&7wgBTOgb_zFFTVs zeD>eHY#_CLNfiuwB&mtOLzk=u!<6cSExptCFhN3#+4})|zQtEUGUSP#Pz(F3kD8?B z@&(7DiBG?FziO8~UL+6m;=sj)eLpeA8I*P^OhQbAo}$*@49P zo)7a)i9DHf5!Q^W_RXWvWx85ti2o>9@{&K1O#ioFbtmVP8R2ltD!@)5)OzPo32g?A zN-ZlHaizhG1i8hloZqcRkmb-+HW#Sn!b@vAwAF!<=-H^88pzGeFSv|Ynnh)Bzf-3qR#+AFkUy-iJa$(?tKW?N2MZst zyA>Hn>FhRaJjd&h5UCgYiIP0*jR;d)Y}S^tThQ6uX_0`e>2QJeM}w4SVLv%bfGHDyrB7r-2Y}`OS+mTO5tz zFRpMHSZ;U$wwF!D=RZB#^oz`aMB&c2ypg*cDs*#{ z@Kl2WE+a4(zMN@shm}>73%y+WQbNo*>J$?TPf-(ItOAPfBw~VH# z<5w#Rm13KCQ|J3k#iLg5egG|&6Y0+;FdJAxYrdDxTADCX{Xy{TQSzpWOD+}6tyysGnsO;+BK7}Fad@6Z(+0$U6XC?6t| z_<_kU!{?^n??wB~tLq^n^tF6#$MRlFBIs~BE~OZJnuOM3OZVaF{>3#YDsiR~2b~Pl z7HfSocIgqnAKdHN;^rPBVOcw|GwNa%+uQBh?T`a2=QUQ+P^N?-@{JO?%1+kOamo_Y zT2@k~ReZVr$?%tnbNLqLf6wV3)Vq;4G}0DPsL=Zo?fR6)d$^K`d8>r@3`IguC!0~N zi!hwFP0}`KFH5>z9X^KnnT^-@uL(uBzb*!;^2iS{X}xG=OnN820x|=Wt=OGlYI^Av zs16(-hO*1DYgrtICQOPYEP+o@v!50?rHHoY;^w4xf6M+lDT|)d>;oWxa1z|VPSBKB zz=*q?B?w?2m5c>)T>DVBD=O$R(>vaK`#B9?Ur9FG^oM|$e_bzkV9QiAAHYSR=jG)5 zz%E`D^7$~Lz{Y3RR|XXNI$@oS(cl{`^)v)8Xs17XynJKf?&k;ccIWN+_Kj}m-WhYc!p9l`_^?!_9lYHo%g4;r#EKBJ>Fr41qTg5qQ>wcwe!_9Ugd zz!ZD(ACFze>$}0o-eGqY8utrU5MgZDejUzPLLvH1M<`cXY7N}giCU9IpQmzt;0P$G zqT+KJFScN2H53mWYAZFQ3nYDZNQ1Bx*X@dk`s%7g8rI75mN8 zXvoG7M!18WM7ln6I8Y6v1~a6kVl}2NkGB1$ytuY8esW7utO8*S>o?tybo8F*T`L6Q zI1*us8#%0lIwv8#2@&PTVnMV!ukA-%pw)wx^JgMu(q9Un%)CCU6_mpAkN+7O;Z+x- z`2DZFr$I~7sbk4cDC&-qQ(u5{k8(+1v2}B9f^gO)R@kV+{Je6>f5PJ5RKS3vyw2s$ z63I3edufBapBcd&#SGA}IIa6*u8-h&-_Te8C}8s;@^--XY{nH#vS*qPFwpPhz0E%{ zeYv&gTN%jT>=o$Z^$N*5uJJCie5SWcROPQFnEA2t!6ak$*PDKmlKOUT?mW*6*S#q> z?}|+m5EG_{>X6a4TxhUDFo+|;8D*v#K};2r;{`(KTS+lCu$d<$U(kh=Ws4muTdPNr z1xC@Ve(Hi>pDo=e!K=5Q6aX#2XZQ%Kg>RJPLfbf_L3;1InaY#=J)fvX4e_u*{CzxY z@uk|0Zp(i1&Ax3V(z#uNP&ey@z}jYA8E>_lK(~tMsVXnD{>nmbrd|7jic0Et-=V7K ztMIv+d}2BveZgK@Nu${ISDvZ?stf5TNX3>lU(_6S27~uz?zm6OrztzJMq;hpz8+uv zIivya8>4Ao<+!+gn=qekYuiwp>R3nIAnL{{hrLkq;%`^}sc~N+kZFxuoz*uW*^cFQ zU$*X>;b@k}OLhVeU|3P37{fz!dN}aJI}42WkS3mE`)gln z*DO~^p?6JpJ#Cs_jgIq_8-1+t==Xp6HvhL9b0H#pA=kDo)_G>K!D)}^s1$R1-7E$T zraCBl8Od~1^0WTaRf8&g{hUTQ>)v<9&SnlSjZWn9R)K!t{X$mui7Z9>VQ(e_4{?pp zklts2&rqCaE3bh(cR!CM;RSb%qx!!FG0wM5pZ(feEb~LEBmOZqICuM_K?Kn-_L;Nh zOLC&Dfl4B~ng4nsDF?NX2q%_QfzE@@WnP#G_2HX(uIWu|(Fn}CivF~VvfLN*Ah`;} z{-TUFT}&7x8wWu|V0So+GFA8|ubJn+(AC@U-UoD%yuP7L`0!u|k3DZc*n!?7ELRtw z15z6<-q5NFMPZbv*6Of#4l_D9(n%qf?6%K`x-q%?TCNh`k^vME|w@u$4`tmmoq3r7($-f z?6ED2jK#YPx}pxe!--*y4}IE`y2Fjz*~~{$iFXe*u8Yu1HcqnU?&Pezsap@kzn{dR zvupRDInsJ8xcmP~Cp@4a%mD_psQC_oxRduQT0;Wh!3iyDF8{mgIUI@Taeuw@B2rj!T}~sRFnYP;>8meL?z_?7l_b_ zJ~&|x+CDgl|MuCr0V9ExIIY`ruYj(4MnoA}12dYE_9+N9iMD!*`@l0enJXV8|>Zxt83ZWBEV7>iEE*Hd*}&k zqJ5$kORv@>?V|K2q#s~S-Y$xCM!{~}-G;d)wq1Q1YFWgIePg99AP&{Lk`(wqvW*h0 zH)j#r<+oWI-Z#>BSA3r!5a$=4AemFH_Ss_bhgj7tQ+Fn5c}ac@&20=t3FfW5?u2uk zgGlI>II7^DO*U8ZiBSh_j^xUfuXhwTB(&}4t z?tYsw-xoQ2|Du}GAlc7C!Mn^lZH%|-k!>};qfp&i4f@DV9DaM$?MdziK55=W1j$3V z;x7r%Iy$27w?C22>USW1-sbwBr!I4#$Qyx+jIsJyC2sh+7-Nd zzhFml#FvG|FCv4i4GT#J8!_q75kFNfV#YF z&&+S74`&#F{$rFqG$ni8M$F?NGbZ_Jq}&nBcs}T1P`Bc62tomhD2g}bb1AVZoyUb}o^1WFvV$GiW zGiz+^@Exz6H__KV)W2J2joxi|dr^4oUFvN~Ld&1*Ysj5bkaYvDjVk^1BCZz*t)wt# zWWod$9TwA7;ke9)az#srI+&Y8Tj-|2oc&2faw4Lr z5!euZSht@8jWkwq?w@w$phOa)Yf~BX1_-?ysq^RCG}7mnYOs1xGd5eg;>1_kB-sqQ z@oPeNDmaZ>Q7B$zWP>DK4}*?aZB31jpU9`zn!O!WbL_1imXGbq3~cn&@4TwOrRrWy z_ZW-2b*An1V72T#Bs&@xKfZB0zD0eCulz!>wS&>f9A6p7a7`+@4gaWE_Ox5JappYW z%lKs{Bm%u*eVt&|)cuO5?tP)agz~$9I%&WoHGvMWt_-Ak{;7H{b$I)*iFRbUB9y$4 zU+z$uTY*RbzxVAQ(}Rds`b2-S9=81hSzg(1JI)q^CzP%NSao@;(abNs!u`kMBNFP z1kIBI;$QW6xUx`i738gcg<)l^C!#}{5JbEFJ^1S8tn))vQd-vG%bb5PK`UJFv1_qF z(pKUgIa7ZTr1zww8e|s~p}Md(BC3amFb1lAlxep`Dtd*&V8-qrX;f{dgGr}K^_|Eh zzhmp^jUQUggr&-VKOb`5uSIiKgdat^RAOi(A1UQcq8}TbQ8Uk1m9$eYBpo#)ugLmt zE|~J6+HYRVuShljMpOL|r<4|-T)vE!ipPqQY-U0c!i_y>$2h<}BRr#(1}}0FsJ#z} zf=#pA9g<&w@&g4>0h^#4SQY(eFC~=9gXl;+<=kk zbj_x*T(l-G6RUu=3gE4?A&pd^Q7Kb30SE%sydqEkOp2<}Xb~3^ zPGiyro5?nZ@*H3)R?wrr+^Z4G2^I_?Rayrlk8PJ4I|agoxtk$1@1^N5+_Z*BFUa#{ zQckpnR4ISzo{{>k5qx{j{U2d-Nrf-x6!>r}{Ny2A6=gsWf4WoDqN@BpINPSU&7gq~ zf=V|!dzP6HvoqdU@Wf`p>P-|&PEsGTDa2h5vMSuZemEVpj6wL#tYXYLehKE7>-6|k zBQ@kBd#$wdxDDMEd#oS}FTHRY|)qe)u0tf(&C6{#W)`V&k+a)^634 zDb}~pIQ?)gW&I3eCQP-mFlcx@qkl?}cKSSO5bB>%4};ouc&=p#7r9KC3B7_J!YC9! z?r(iI6hyR>fVUPQn8a~#)*Du0_XqEjq;f$W6X7@CsiB~_M$k}@8@=VfN^#=5p(IIZ zX2Rhj4eN_SRyZv|Y&Km@baA;f@lYD$%4Ljd`mx{i?3yX`D1_C`m%pjXWIV>L{rVc! zhyq!dN-GZ{QCfV~5U*6?;*B#)jA<|^kmJp>{R{VN@nBMOKZgV+-v)QFk`GVP$`5Lx zWgU5qy+q2`9#b_-eA~wqYE!^;hFhabp4@VDQw!Z=ijDq}Y)h`#4xKLgKa^LzG5U~Q zO+8q&+l}8MI@N$kSvvwplC6FNUrz1A5@}I#({KMNtiEIS5Jf1Da~O3l<83Wm=DS+0 zByK1Fd~K^oaAB*AGfaC!#1VPN8HKzuoBT%+b1Xu}ygdyc-vO?10d}JeZrMR-9k6u( zokQhUL@Yp^g8(Rr2w%Y3Yw>kfSuh`12}jb&9oUU>KYHfkrt@?HSx9vG+1p4x`P!53 z6ZNZj(Kt4=N;X)?wO^d#5TPz*ctauOBX26`)nTn152t>cqWuh+Ge zSwf`n&7P;P^`F|pi*?BaU2&A5NaNCMD(5Vm5^u@fbhp~{s*XiZSHOjfJ6% ziVZAKJ;KD_pY1U}ANYQP4&~0N6FXs2dw`Vgm$UABf}={4~2){<~MTI*FrnL$MBPN&}85D^QP_Nf*!UiA|A{0Zy2+`DfcO>%=# zK3L2S@SG5T{J|Xj*8!>T1rxv&&j*=^P=dU=lcZdmU%T1`x&Dv0FsA4)bus5cg2^At zhZiWBi%^Y@0#u_PjY;zPwTESEpPhgoo@Zt zu7Y({Pd$ygmZaFNS4Yff$u@(o5Yb8ZMhqsEh1B@X75)nazO_JUi-8nxx(IozhCDj= zQji3V%}X_F&nlU3m1+~?DK~j0ePGJ2ur1~s0|#AHktAEj80pU^7wKvjWl$awmkD2;>r_f1CQlhq!DoJBI`p`CrcWk}L>DxR)B;qv-*?T*L}~4WXi&6> z#BT7b#@}T(=mZfolDfmRuDQU@))$+Ov0!Tj%M+SGAUCrWE=RqFX3f`E zH!-=Pjqpx+bsEY4+{0U3irpX9qGdL#wZvng7N0srLD#w9MLA8@(#J0?5K_cz0*O3J z#-^x%j3~I=$~1K||HWQ3J7K5A{3W(YBk7#OJ3ajh%a@k=Kyr7u?V7G$bROaGhiw$Q zQ3S^Cx&}(${06q*s0IpGR15#-VA9hlkA9|OfC<^KKJFNc_uSgkw$Sp_h z@=RI@_9#>T=X{!TMw*Udq`B?5Kr^|UvEjOjwohxTxve4TDhIoGBAIZe;UN_>;BUY< z6aLbUVmGnng+}r~*TDSZWY*b~Ga7%zXKVr&Zuu?AcHP~oC2p5o<>a#;J!e~R=1SRXa}j{xlfJ%v#H+gH^7mf-$R?@U9p9?C2m z10EP(V~5}?3F@E>=zRkRD*wuI-d0>c1dVUPSU(rErRdkrbUO3cuzj6vHND4BqDueX z+{*6ksJ_q4NtwQq*()@$ydR`8{nMqgl}7S-ShVC(lmhNVSB8R`q`1yzcyJ+NB@(id zF)lOs5{JvA+bVG-ib~(E1vdr+e>F;&KA*6Zs(L2X+Tz{G!t{Xo&$7IUV62IV*WmC= zKJKvpm+&gvQW1+Bi)xpRbPe0?Mh%Q6T(uXvy}EnF-MXyvV>$tj8i}H%HO3jMAGyCV z)f&%I@J4_m%VUy^vuUlD?e2>;-YUR;b#(YYh4chuBRxq%Fiy-UKziBx_xARap+dP` zT(<}l@sB$drt+|*VanzW?@CUuq#RJJhl_7GWIZ=y5~3jBTttw$lEARu!1(<9gymLb zHl+TyogR((jJ21s6T)I5$QDy271DHbd4)& z&gc@kWtzZ`t&Hk^B+GUZzO&fmlMGSu&jBr2#Hudj#S3?`ATCl(3_R+#P$PV`Wi*7j zkC^guq&Y|87=)K^MM&98~8l&UBmE zQ7&Pc5ks!VqYHkoLZc+uMPIs)k6({O_81Qfu$s)^PSM87N%y1K`hkmU5q=uxD+@wn zcm(Y!_YU?T)P8$65N|9>-4go%gAWMZ7ByPyF%;c#DN(Pel9K5Qr42UU7D+XFCuGu~ z`c$}!DD_!A^b*d+k~^2C=U?vX{jDL*QMbZ|gy3J}yyS*%$c;bB#HZc4i%stf7l))# z(=OULn&d7*u$ok?`Q9~{nWfGQKH~a;R=wAzy)hz?Mvi~o zZ&q{?L>6DJ2I*>;GMzP{P%T4c*9}D{#%@Y90=*Ijf3w}huv z=HU5gx%{9oxY{dm)+YMM9N7PF?>o1h&)5czVcQqG2Js56SnIDrFRkWp6YYsb)fjmq zolU7h2!&|qI_bG?R%J~bPq#B41ibbHO$<-BSJ^Oaqsd_7&za43nXuGU#1at0l*6=Z zCP%B~=!8Us?fte0fetuSU)PdIKRf0`XTnWw8LE^(tWeh~2dXBnG#*!BuNmR+P@fHB zZVX!SpbmSFC+`lHM!53XYNJ91$-2#HyNU%N^D!lwzwo7oTc6tCnxv}6q?-;#N~Hd@ z_b@DynAO*Me5YJUnRC6Li%n5`lv{KcrE%e(WrK>+@6?r!`SsFqVteEMvWX-NvRR9{42oGl}nSex;TGIMXee9^N_f5cieC^9~B{SHKt8ehv=rovfjG1=xqSL z9&9xE*bIAw2H)71Cd*PQ>h2_qDv%>7)nR#A*5RH9a z|4;M|g#`5GL^tomeA_(Y;VPYqh{h1D3YJsS=vk>Y5-50YPqjM65`zn9fyC zhrd`jBCEhjr7EV`%lZMz=kl6;`Q2wJ@4(U_#P3^GIm(DgappY>Ice z4;ZI5yuYK#z~;>cj1RxQy&MH>PuDx@kN|~s#{KUiSm*mEXeCf7Z&t}9@*oP>Lj*&N zQLm?v+3nebO|%;I#g>ATwb{FKOYa8`fmeKI9bflZ|J3#!g9iV(X_@_bw3s8ufZJai z`;Sr%BDsKJ$h`IjO6jArAJI{O;{S(s4Pp*Ks zyNk;M+zOcXEINN@id1@W&a-~vD`!(=hTnkt-rPMp?aSJDiU`b)Z0*E&{<9A^4)xC~|*dIv2r=i-A{T-fRC%;$D*SPghH? z*TfgY$_c74h=kVPBWT?%+OX6}7(q{e;A8mtq>}}u5hew^gv>N$0^J_VU^2g37P}bL zzRx>t%*~L`F3B^r>Nj$D2U+VVK+NzJIsUbOHJuU(H}cDr#C6WtEcrEghXTep8d$vh zx>?#4voL=yq!n+S{6OOB(G2kXmzR)zL`1GSm4XRE`H|YT4i9(X*jU7S92M zmj{+NZqET8_LD$~?FkmZJv#OXtUiFSWE*8!693rFet0)5vs-=O^(Ra?O95MxDWy z1Fk}J0#4ci6Q0yJ+-#WqCjg`WGjK(;Y*;DAcMmt){1&{F_<%A1UBglvToLELeq0e} z;9Wv8viph6Fm3zTh}m<(4JL^`vB5c;HO`qSW`x*Eozgb1NCDf*FPfXjYh18@@MkW` zd z>SAMfZIp+lWgC9?^euzG7NVrD z7hncIIUTcuZVRSYfP1?;@OJo-&{*CjAo&dTzsAYrU751G_34ypyA{vAhXzm z&1g64-ziuZ{4+d}CZOx>sZ*yHfH2uR%B~_9Eqb_xI)@#wZ4lw^Q$%ZPd41x`yxV`! zm`bVtSsPj&zqsFnc|b4!`8pF%KzL|z=vB-ILY(EY?H*(ds}RIWsk0GLBiXsN6{P<1 z2)oLhUh`%+xGkL8LzO8T!$Y$riqihiw7Xl^?yHe8xbr`gd?#T#;s-Q11&UBh_6K{I ztYmXw)-pQmVUH{~%Vf23n{G&1b+ra^d51gvFrDP{VT}zCq>>SI_Od8tQ^#Ui5YHzVJz|Lyp2oX_$(}2n zkTh%3Ub*OHG0LdnsvIf#T$Y$EoRa=U%R$5n2@(F!sY4eeXERhEtQ9+C+q;@3J9Lvc zP+NnjtdiXh&Kymg5uSmi9KX}Ev=oAIJT0o%qm)HuB=at&>{47cJaRc+nhdF;tG9!+5ch&=1t)1 zdJ@lhzrFY%j5sv-O7g1-X4$dH(RH5R*$5LetC+t!E^PGqc87&(6vnPoSfiH5@zW zb-jxS{K}IFw4;_{#<}&ymYTIGg4J3O3j*{y!VAWq+c%{ie?A{CI3V-g1@4QR^Zk@D zq7TY+WKervu5AU4qk=)mS3z5E_}x^Z(0f$8(u}Km3rC|(kqlu&cWz7WD+i19v#F`Y z-oFeSr`tyYK3;i`n>}Z1WVAf{*0YAJc znB%yprdL-%_;RtghlK@X5d!Y+eSzH_0*^~VGu8^t2tVPRZ}qMy7>((LZ24%%JLO@f zBE8(gSvR<|`S|%ic)Q;?!&COb_v>X{-&(s?Sx5W6S!G!_7P%{1*+$0M~mAW@H z-)AD8k8La)T2mGaW{eJEhS8xChwrteMZD1Z-t+Th(0`tKEh{I^|h0jM~W0}Dw$H@*smA{_EyBxVHF(REmV#-wD7 zyc^?$`OSxch*~wJj$ydK%<@9-hxYks>inFz-K>wS6SdUu`g60tMm(3gj(KnOTMVxF zMcZ@4o8g-V65?X?zytwPDH)3awt5x|Xl5)ho0JJi37v4r*wNyjz1AC1WZEn3|EY>A z)RwbMpPW}WEfloLm=&UG(fmdPUuwe18LC>DPCIqu?op7 z?a29&zoTVUr~$659W`oQ*5mw4d2{}3O!bAixTXNV*Ow9K7XeH7G)c#~!6tvPMaMMI zxXBXS&9k7$VmA9N4j-uOK;dwMKHGK9O{t^sExoOs7tN(XC)Afj1_th0?iTD!I>iqr%X? z*SVsMOaisPb;IF>oP8VgWqgJ_G@U?WC6V$I?{E@Fbd7NJscL$-vScO=cC zT@W1?OCsi{j=pY8>+&!y&H9xc~fqz^bUA75HA&Is;O&UTKHblfohka=zUDS%YEH9|VO&&rueiz63Ev!>8 z8x`+H!1_CWk}Sz&q@Iqlgk2c{GFJsz_R*HALy`!dtFPgZlK4JWI6Zj*s~W~%L}+m) zgpl2($H=MDD9D%-X*eV;Jt(EYUDQ4(jkCfG&*vW{Z#{&D)wS2pT!6)?t+Ig9CMwG8 zEeg#o;Ub4C!}#~bab(=?wnx(qX}z+7uCtshr~Xs0V+xA@g>C@oaUlKE`+)r8z+WKo zX1jLimFo{(u4IjQ<}g{VmuN5S#R33Z5_bkNSu`mWaE*{A94l>bX>Fa#2>KK- z{}gQZW>j}PjXab0e8gak2&h@(@78O5*#Sx4GLRet<2z`$GB~< zi=i@KLW|fHG>j4E^*G>kxllq-htY}glMgJwf;9SiI9Q*SPYbpe_l4K}s}?Vpyu`ZQ#uo;PW^zpCtsO4dDCq0e}vqlbX^1etBM^FRjpx8e( zyz%Z2q@Q($zDK-C&kX}{*YcokX)xbJz=uCX3FPe$m`(;5Di3XGhMM7GnSt|CO`C^d zzO)8uMk9TG>_E>-3*YI}mw2WH599=D8l3`|U;}~q0OSD2Sb}S1us*8~0KQB( zgt)o7BAzD+7+PH21>*~cei7ULHd~XqEh5*er^-fkm2C>NnNLuS0!zua##6^2z;+$Z z99Uzg20O;0r2zKLUh*)d`w5YM4+$KfvkVJ1vSp#XXax5CB>j+>6`l3D8C+l>J@!H( zj_Q3+Ngb-8QRLNf>1vkA>V3y`a4&sN=L9%~_0@gl{&LKOPWwWKrQ%ipW=4{lfC(5dJR}E-y3GG@G}&sf}TS#;@+$ zKdw1u$YwR@g1|eQvS?4YsN}D7dT6>MTvY{)LH4L&i#y$4Oye@)y&1wCJb10l$9%JKTc6JA5g2ub5WJP4Bov#$e7 zrkCVHZ$(5e?f6{^76j>+f2Hjt!t=%39V?15@VACZP=TgLpg{A)k3aK^)e6{g?p26~ zNbVKDGn@h&qKmvf7*^mb66@WTn;?Hz7PSTk^2lh~jS>=8m=686z$!fma37DerM=z` z5JK1bZv;ob`I9)u7Y8zys-``yQX*B+G;Gg(92Jg9Ej0tiD}`wS9DB7E2eq#%w6{tG zKSVfpUmXv%L~`-dNwU&UbdyX^wN1Pw_B#!Xx)#B&&wl6czy+pUC zfWG7UhnmrO2uMX(?}8vdm^lyNh}24z7tU$q=-Gm)NL-Q52?zytl>VFO)MiJtqIiNU zxh3o|!+F8`F~b1BXoVT1qsK_ZPtq5bQv7BeuE!~NG9yqjM{h5Q6d`Cw?Bs%BK&?6P903}#eyTLmgbZPP?`j@(BA z+dpDyJ)7z@s-6*2_$~^uEHa`c_;-gRf`m-3N2$%?c1r*OV9_dOJ!7=jd z0i1*$$v_;a?HZuOXeEKct9lee)mo9e8x-z4Urpmj=g`Fr(AuEBMb5^`WI^C|j^#l? z!}9wb+$;Kz--M2ZhJe7(3#obbX;-q>V9rFwFG`z$&4+wQdO-sYs&D-`JHr=AHLyTcs7`oYq3dGt;%Hw z`!+Pcqa@>x){D%=wZCY`UxfsiEZ)m+vk|dG-pzk=`U-fsqs1wPLvKQOYy#PEBLM#5 z`xTGjCm;e#gzr(ZY!hp%p*Dl|D1zJ6@G@vh$NE8w9nHAWvzp?~c6{dj39 z;}`$tod$gL^*vvvS0NdgiyomQXT=9_uSPMS(0Zuf+T$&+^({I$M3hTJ2W;83T@tr* z_23m>(YmUzI#*C{?NP ze!BXCffaIlV57XIGmWK(E{;a{%MA=qNOzr0FXZ}a z64&s`Zn?k8M**R6{Z65fHy9(wCne7i!zd8rH=D`%>+!(!3YZ3QgrXO^03J*#;4Aru z?XmwhYBa)n7NiD9APHvN1y;@UL7X~}9S*1mMn$4N&L8SK!>XM<4FywQsixs^GI>J% z7GY_ETv$;41|6L{yaqEi75k^DPfan7k&RKZ<6j+*5hml5!gQ4U>cf~2P*AJ!Z;$kQ zVEv=v=Q041X;A*Z+BNnpL=)^lCY)xc`0)DOm&zYJTO;&>n!q2VT`@HKd)b;H!qgviQVjfrUd@79A>Z#W(uRvF_1j-s~@ep}QDBLSP#2~_W$aUveif4{aKo7U3b zO?^cl^IdIMIMK8xy&#)s2j{fAMGIPqQmox+0|WUZ6t~$kaOexMLvu&#%|-@OX5K}c3C+AVY~!9y8{r1#y$Hcs1Akli z{dR$|r}eD>5%OctJ9X+c-LnKQSa=RFf_`)uOh7`Y^~g36qi@{jt$~0}s(*9;P38+U z1>0Nm+!wQo)m2FK%ChMzQ;Cn{7r!V9OK7&MD7RJE9d^#DlO9A~HDzJ&WL*)IUsyC%JOdi}a6%>F3lI67;f1T5&of5g+Y1wZXb4dpuNJX0#jFiMG& z4lDBBE&09mQ9s8K7F-x%CbP2a!k6QIDKfT5Iyp7SEiWSGNy-{-uZ#F;mfU@{0s>oR zybjnazI?D{{i^`%2VmLPry1ZlrM*|NYIqEgKq)iCkiG;KbBg`80gwCg%55-7r!i($ zkZE?j1HSb+O?-xU`w3nW@e8;WczoBH0eXCaGyD`_Ou4`QcHk*0;OgNCgekkLHemVc z>EuP`<6JOvs_5UawWO`@?eTy$6<-KvX>}TeV=02E)s7|MkZlqEZ7ppRXcz&oS{sF= z@QGdrWcvWfrsa=w6$fV^z$^=@z5pcFa|7r->w7wb3#Ov4a)6_VH*4iI35LH=>IYx? znswrskXGDY!3)HPZUaF=10i0mHj*`_I&DtIUn8rkLq3GupWZT%?CD>X=dd+9*BewtyeG&@fL+PSP%?-Z8;11)N%yzw&nr> zRwE1~`sPUD&^MJ6N3LmXayrjjOx|Dh3wKRlQC2+{nHZ z{>&-yXY%)dsOi{99*w0+I`C&~B(;)BKi5ZjWzd!jLXiLWgU%0iw!o_ua2Rr5F>dt! ztrfe-%w~jWaX8!*HarWz-BdjPlBV3cvmbw?JPpQ}9}&I%{bn0T?kG7mcijS19|q(% zb7z1OU!to3C-P%|1i3Pj#jlwgC5F4fy&Z^+r^d|h%pL7->hQQe#(EiGmZ^6fuap=~ zl$Px@@_4mG>>jMcU%XKhdtHhR&spQVrh z;p1Be9vGVkI+$ij?*U_wH9+$3>;YiffAT4?htRle!6`u4_^0c2quPU&wl*dURfq&p zLkz3(x$7y!GeZg1Y6s0BUy^;+G%e!syYbCffmyy#4SxU##Gib?uW`WdJmp0>Qe6Qz+SJ7*ISw+|((_csc7tVp{1e zUtM<*L3n;paUhC~CV?1+b;vFjza(2h=xBF`|>E0uO*52BUDo$Md zZ>dD&qhDBQ1HQlB@jf5eWj*sEDQ61cre%-A?bXnG^Gix|)aMR{d(n;{tOTWV&V1Qu zG+>#oJ;Jshp)3Jb4rr>B-U~hQ-WV)v0Jd?;e1O&!eQ=_Iqw!Cjduz$|<@y@BV#*kV z=FpxsaiR6ux^KpLd3MqEwNeN3R~4T1jPc4k1=L40s!KyY2LzrGM>S-8+Bz$gxRwGw zsh7`hnx{VJ(?H;n?0u*BQ_HCjT+;KZ>5{Ha_e38sAf<2Ua1Ag$0rE_JTu(p}|MSiv z0BTD(HE6AcZvhLe_=!)XxQ2W^-;0C$k z+F<0((|?!?@DW63=&d_6ZLl`gLAgiC*U%Dil4DVsB}4%QZZ8to5#z`p^t%%3zT0LXk%L9u z1NyEBJVT(GfO{9%H*c&GkgKIV$*g+xVtsFZin0+l7^(EDdzBMCwaIW^0Ux{Jg}sY? z$02&VqrYBXzU!y=O63n5?_tD&5JR@v@$TY9PZU%4#%PHsgpRNc49;}dG0^NV{H$Q1 z9xYG}$0zXqE|ByRY4g;17Iok=z*zX^6IN*mV0K(>jPQ74vl}2^T;xc!)}J- z9X3vrcG!mZ<@+1FF(i{*s+j1=i>~-vN_)FwW3%ps5BaK@_Ymj{o}IV&g%9>Fowsfj zXSV5MFfP<&MUd&=7Hr?lZ2eEk#!Fu&vfuyz3hz~)3RdvoX@m3*K=f(>2oEfm045T% zji;eJ4-!bK67peGz3@d$EvxZL2Bg0q*#h~+?|Od*RH|!Um1IGMmkDhe`38IC zW-xL7?HKS0xiU`XGa^};9}j$!77TZ2d<}P;@RYro9#7Q|KFUrdKG@ozs!j2|)4Dh1 z9$@N7cp}YlUrzHv533cb6S<;!a+KGuJK*3`2d0sJ%+cRckA(D3Ex1qBsC^j~7k-;L|9}Ux z3qX1y_YRN znG8uniTIP)$M3Tq=qS_ug2|t;YBh%o9<~RD_4WcWIp#>Q)Qs?p4F)c+SpV1GBV5U! z?Q&L+I#lk;H;|M!iYwPWM2@k2toS3pypZu0JsIj8;dx4~?kDafs0j&$YkljzUM0FA<-3z! zVM<@D*B+@^(ZiQ=ASHyy zT<)pePsEgIye|>socV=dQ(m(1*b}L%grA&ey-%BaUaSe(YY*#%qOLPee1^JKbI4v} zL?ZKiQVv+?e~kL!nbj$avJA$dEwDOCd(VMvR7$qv5oVfSw0d1WOF^EqHSs$;Fi%TFc z^nnnjGw-9>(oVSwk2mnwulV_8X+d`(3|?+D)dl>z)eK|!>NE|qgz$E);NhZsQe_O% zyz3OqcduU~U?KIg@Rw69uSR*26&!f~V)GfzA$@zO0Dl7`4|)&`P4u<{itz#KEN*^Q zTd>z&v(fA+HD2tC()wwU0-ATA6>cygrElhuyV0>T&SMJ!lsArPhqXKP z&3q&iUChHQTjEP~jtmvK#ssE3jp8rcUD)QFCQJq@)c&-9Ke!OPWMC4Ks#-1`kg8*y z2a4a^EXQrxc`a*mGPT=y1PG%~k+B9yKgcxpJNbzGHl+VU({M}qylcIr764brD$o_g zftEqrDfUeTR2AfbmI_USQ(qAlnNRwT*&Sw?6FK)In~dK<5Sm4{8QCyV*fIi+U#=M{ zu$h(--NHzvy_ZUXv3H zZ(9#xSQ2D;(4ZmK&Jc$~p{G(<9l1bn&xRqPrc{DtzrnhQ4N7tIa!EhTbsS=%GP3s9 ziWB0eA0B4wPXDW&;*HbR2$Pkf9DsY$}uj}}%On>M=d9?jal<)Sqc*0G!zr3J*k!TZ!z4^rT zsGP8Uvu91A{{AXNJ;sM<|9eXL))Mh4Z`Oy7C|}kH9QJ`MruipX5HnWN z5;$sD6%pe63=66}|Jv;u_;E-_m46jy{!-b2p!#gw`T872yt{)Q3+vhdrk`MYtf6q0!Qo}57%=BzHwHGCC|+!H zJ<}e1$WSi{!I%}#M_(e_;yFj-7?;D+wUOC47#X1^v;)n|el-T9MP3f1IFe}vf^r-c zWq06L;hO{x7hiyfZN2U6R$=YU(inm$_MU9kRQo_@nC~938lBjX+`muJzrz?VCUkoE z5QL;k0*R@DZy2HUxd=w*w%4&DZogESk&zz>xBS@SO*X~bWTp0$kisu+uaSn)+NZ zZ2NMbkoI!&-btfj-WWei z`upYUTbq9Kvs>+jj(5XmFeNhi%KDjn;2x(b<^!kPM91c&jRgfJ%gfe$exwgP*8)ZZ zdaB00X~P$jh@C!n9Fvy9fd-pAAu|u&1q|C~F8wXdKDEp4YZLp$6hz~;n4qbvo^sjkiaBGl!EwibxuaSL9mqZd{$@^t zKX^YnodFdR≺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%0DMtCtJE;E#b7M2wz*egNW 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 BBZL3| From 23dc75bb912358e76258de7ef0d840103eab2fa3 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Wed, 29 Nov 2017 19:27:00 +0300 Subject: [PATCH 049/149] Auto respawn for web_video_server --- clever/launch/clever.launch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clever/launch/clever.launch b/clever/launch/clever.launch index 57352d61..3caa15c0 100644 --- a/clever/launch/clever.launch +++ b/clever/launch/clever.launch @@ -24,7 +24,7 @@ - + From aed0ca99a80621b615b3b7f164be43459f53c83e Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Wed, 29 Nov 2017 19:25:56 +0300 Subject: [PATCH 050/149] Use nodelet for camera instead of node --- clever/launch/bottom_camera.launch | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/clever/launch/bottom_camera.launch b/clever/launch/bottom_camera.launch index 8f26376d..b0c629f9 100644 --- a/clever/launch/bottom_camera.launch +++ b/clever/launch/bottom_camera.launch @@ -1,12 +1,14 @@ + + - - + + - - + + From bdc9008d05419484c38f318d39a292c62522dec0 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Wed, 29 Nov 2017 20:08:50 +0300 Subject: [PATCH 051/149] camera => bottom_camera --- clever/launch/clever.launch | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clever/launch/clever.launch b/clever/launch/clever.launch index 3caa15c0..5be50ef8 100644 --- a/clever/launch/clever.launch +++ b/clever/launch/clever.launch @@ -6,7 +6,7 @@ - + @@ -32,7 +32,7 @@ - + From 95ccdffcdd7aeb32443dab4b4c861c02edd0b8b5 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Wed, 29 Nov 2017 20:16:14 +0300 Subject: [PATCH 052/149] Remove mavros_msgs from generate_messages --- clever/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/clever/CMakeLists.txt b/clever/CMakeLists.txt index 2f3afaba..15929c58 100644 --- a/clever/CMakeLists.txt +++ b/clever/CMakeLists.txt @@ -84,7 +84,6 @@ add_service_files( generate_messages( DEPENDENCIES std_msgs # Or other packages containing msgs - mavros_msgs ) ################################################ From 15635d28a1c6ed053eb00f659d1bb6f24f596671 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Wed, 29 Nov 2017 23:08:29 +0300 Subject: [PATCH 053/149] Fix --- clever/src/simple_offboard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clever/src/simple_offboard.py b/clever/src/simple_offboard.py index f808fe2b..cf62ef22 100755 --- a/clever/src/simple_offboard.py +++ b/clever/src/simple_offboard.py @@ -278,7 +278,7 @@ def handle(req): current_msg.header.stamp = stamp current_pub.publish(current_msg) - if req.auto_offboard: + if req.auto_arm: offboard_and_arm() return {'success': True} From 03fb0e96444fb0c4785221e1a22529fdc796aac3 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Wed, 29 Nov 2017 23:09:42 +0300 Subject: [PATCH 054/149] Cmaera parameters --- clever/camera_info/fisheye_cam.yaml | 20 ----------- clever/camera_info/fisheye_cam_320.yaml | 45 +++++++++++++++++++++++++ clever/camera_info/fisheye_cam_640.yaml | 45 +++++++++++++++++++++++++ clever/launch/bottom_camera.launch | 2 +- 4 files changed, 91 insertions(+), 21 deletions(-) delete mode 100644 clever/camera_info/fisheye_cam.yaml create mode 100644 clever/camera_info/fisheye_cam_320.yaml create mode 100644 clever/camera_info/fisheye_cam_640.yaml diff --git a/clever/camera_info/fisheye_cam.yaml b/clever/camera_info/fisheye_cam.yaml deleted file mode 100644 index 55946f2c..00000000 --- a/clever/camera_info/fisheye_cam.yaml +++ /dev/null @@ -1,20 +0,0 @@ -image_width: 2592 -image_height: 1944 -distortion_model: pinhole -camera_name: raspicam -camera_matrix: - rows: 3 - cols: 3 - data: [1.34689524e+03, 0., 1.30767920e+03, 0., 1.35094361e+03, 9.60238450e+02, 0.0e+00, 0.0e+00, 1.0] -distortion_coefficients: - rows: 1 - cols: 8 - data: [1.11718277e+00, 4.70912345e-01, -2.16258281e-04, 1.71516924e-04, 2.32202095e-02, 1.46837794e+00, 7.92173021e-01, 1.19647684e-01] -rectification_matrix: - rows: 3 - cols: 3 - data: [1, 0, 0, 0, 1, 0, 0, 0, 1] -projection_matrix: - rows: 3 - cols: 4 - data: [1.34689524e+03, 0., 1.30767920e+03, 0., 0., 1.35094361e+03, 9.60238450e+02, 0., 0., 0., 1., 0.] diff --git a/clever/camera_info/fisheye_cam_320.yaml b/clever/camera_info/fisheye_cam_320.yaml new file mode 100644 index 00000000..76fcd8c2 --- /dev/null +++ b/clever/camera_info/fisheye_cam_320.yaml @@ -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. diff --git a/clever/camera_info/fisheye_cam_640.yaml b/clever/camera_info/fisheye_cam_640.yaml new file mode 100644 index 00000000..f664bb7c --- /dev/null +++ b/clever/camera_info/fisheye_cam_640.yaml @@ -0,0 +1,45 @@ +image_width: 640 +image_height: 480 +distortion_model: plumb_bob +camera_name: raspicam +camera_matrix: + rows: 3 + cols: 3 + data: + - 332.47884746146343 + - 0. + - 324.38022493658536 + - 0. + - 333.1761847948052 + - 219.6445547142857 + - 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: + - 332.47884746146343 + - 0. + - 324.38022493658536 + - 0. + - 0. + - 333.1761847948052 + - 219.6445547142857 + - 0. + - 0. + - 0. + - 1. + - 0. diff --git a/clever/launch/bottom_camera.launch b/clever/launch/bottom_camera.launch index b0c629f9..65beb928 100644 --- a/clever/launch/bottom_camera.launch +++ b/clever/launch/bottom_camera.launch @@ -8,7 +8,7 @@ - + From ab5835b1f852da31afef9d6cf34be58c75ebfb46 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Wed, 29 Nov 2017 23:09:54 +0300 Subject: [PATCH 055/149] =?UTF-8?q?Print=20arudino=E2=80=99s=20log?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- clever/launch/arduino.launch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clever/launch/arduino.launch b/clever/launch/arduino.launch index 6ddddf9e..593f38d2 100644 --- a/clever/launch/arduino.launch +++ b/clever/launch/arduino.launch @@ -3,7 +3,7 @@ - + From 09f4be3665d68562018c44737be705fa9e31cec0 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Wed, 29 Nov 2017 23:09:58 +0300 Subject: [PATCH 056/149] Fix --- clever/launch/aruco.launch | 3 +++ 1 file changed, 3 insertions(+) diff --git a/clever/launch/aruco.launch b/clever/launch/aruco.launch index 2c3915bb..07da39e6 100644 --- a/clever/launch/aruco.launch +++ b/clever/launch/aruco.launch @@ -1,4 +1,7 @@ + + + From 3c358aea5ab9fed0eccfd06d667e167d3d4d1b09 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Wed, 29 Nov 2017 23:10:19 +0300 Subject: [PATCH 057/149] Use USB by default --- clever/launch/clever.launch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clever/launch/clever.launch b/clever/launch/clever.launch index 5be50ef8..9f876e56 100644 --- a/clever/launch/clever.launch +++ b/clever/launch/clever.launch @@ -1,5 +1,5 @@ - + From 48c9e64f196c5eba0881e8c07ad9522efe4ba685 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 30 Nov 2017 00:36:44 +0300 Subject: [PATCH 058/149] markers_ids settings for grid boards --- aruco_pose/src/aruco_pose.cpp | 61 +++++++++++++++++++++++++++++++---- clever/launch/aruco.launch | 3 ++ 2 files changed, 58 insertions(+), 6 deletions(-) diff --git a/aruco_pose/src/aruco_pose.cpp b/aruco_pose/src/aruco_pose.cpp index b68c1e08..def8541e 100644 --- a/aruco_pose/src/aruco_pose.cpp +++ b/aruco_pose/src/aruco_pose.cpp @@ -27,7 +27,7 @@ class ArucoPose : public nodelet::Nodelet { tf::TransformBroadcaster br; cv::Ptr dictionary; cv::Ptr parameters; - cv::Ptr board; + cv::Ptr board; std::string frame_id_; image_transport::CameraSubscriber img_sub; image_transport::Publisher img_pub; @@ -72,9 +72,45 @@ void ArucoPose::onInit() { ROS_INFO("aruco_pose nodelet inited"); } +cv::Ptr createCustomBoard(int markersX, int markersY, float markerLength, float markerSeparation, + const cv::Ptr &dictionary, std::vector ids) { + + CV_Assert(markersX > 0 && markersY > 0 && markerLength > 0 && markerSeparation > 0); + + cv::Ptr res = cv::makePtr(); + + res->dictionary = dictionary; + + size_t totalMarkers = (size_t) markersX * markersY; + res->ids = ids; + res->objPoints.reserve(totalMarkers); + + // calculate Board objPoints + float maxY = (float)markersY * markerLength + (markersY - 1) * markerSeparation; + for(int y = 0; y < markersY; y++) { + for(int x = 0; x < markersX; x++) { + std::vector< cv::Point3f > corners; + corners.resize(4); + corners[0] = cv::Point3f(x * (markerLength + markerSeparation), + maxY - y * (markerLength + markerSeparation), 0); + corners[1] = corners[0] + cv::Point3f(markerLength, 0, 0); + corners[2] = corners[0] + cv::Point3f(markerLength, -markerLength, 0); + corners[3] = corners[0] + cv::Point3f(0, -markerLength, 0); + res->objPoints.push_back(corners); + } + } + + return res; +} + void ArucoPose::createBoard() { + static auto map_image_pub = nh_priv_.advertise("map_image", 1, true); + cv_bridge::CvImage map_image_msg; + cv::Mat map_image; + std::string type; + nh_priv_.param("type", type, "gridboard"); if (type == "gridboard") { @@ -82,6 +118,7 @@ void ArucoPose::createBoard() int markers_x, markers_y, first_marker; float markers_side, markers_sep; + std::vector marker_ids; nh_priv_.param("markers_x", markers_x, 10); nh_priv_.param("markers_y", markers_y, 10); nh_priv_.param("first_marker", first_marker, 0); @@ -92,19 +129,31 @@ void ArucoPose::createBoard() if (!nh_priv_.getParam("markers_sep", markers_sep)) ROS_ERROR("gridboard: required parameter ~markers_sep is not set."); - board = cv::aruco::GridBoard::create(markers_x, markers_y, markers_side, markers_sep, dictionary, first_marker); + if (nh_priv_.getParam("marker_ids", marker_ids)) { + if (markers_x * markers_y != marker_ids.size()) { + ROS_FATAL("~marker_ids length should be equal to ~markers_x * ~markers_y"); + exit(1); + } + board = createCustomBoard(markers_x, markers_y, markers_side, markers_sep, dictionary, marker_ids); + } + else { + board = cv::aruco::GridBoard::create(markers_x, markers_y, markers_side, markers_sep, dictionary, first_marker); + } // Publish map image for debugging - cv::Mat map_image; - board->draw( cv::Size(2000, 2000), map_image, 0, 1); + cv::aruco::drawPlanarBoard(board, cv::Size(2000, 2000), map_image, 50, 1); + cv::cvtColor(map_image, map_image, CV_GRAY2BGR); - static auto map_image_pub = nh_priv_.advertise("map_image", 1, true); - cv_bridge::CvImage map_image_msg; map_image_msg.encoding = sensor_msgs::image_encodings::BGR8; map_image_msg.image = map_image; map_image_pub.publish(map_image_msg.toImageMsg()); } + else if (type == "custom") + { + // Not implemented yet + ROS_FATAL("Custom boards are not implemented yet.") + } else { ROS_ERROR("Incorrect map type '%s'", type.c_str()); diff --git a/clever/launch/aruco.launch b/clever/launch/aruco.launch index 07da39e6..f9013c2d 100644 --- a/clever/launch/aruco.launch +++ b/clever/launch/aruco.launch @@ -10,6 +10,9 @@ + + + From 9a12e295ac904fd54cda9c1c085e8be6ce5e2d4f Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 30 Nov 2017 00:41:31 +0300 Subject: [PATCH 059/149] Cleanup code --- aruco_pose/src/aruco_pose.cpp | 217 +--------------------------------- 1 file changed, 5 insertions(+), 212 deletions(-) diff --git a/aruco_pose/src/aruco_pose.cpp b/aruco_pose/src/aruco_pose.cpp index def8541e..77f17d80 100644 --- a/aruco_pose/src/aruco_pose.cpp +++ b/aruco_pose/src/aruco_pose.cpp @@ -3,7 +3,6 @@ #include #include #include -//#include #include #include #include @@ -17,13 +16,9 @@ #include #include -// #include -// #include - namespace aruco_pose { class ArucoPose : public nodelet::Nodelet { -// tf2_ros::TransformBroadcaster br; tf::TransformBroadcaster br; cv::Ptr dictionary; cv::Ptr parameters; @@ -37,15 +32,10 @@ class ArucoPose : public nodelet::Nodelet { virtual void onInit(); void createBoard(); - void publishVisualizationMarkers(); cv::Point3f getObjPointsCenter(cv::Mat objPoints); void detect(const sensor_msgs::ImageConstPtr&, const sensor_msgs::CameraInfoConstPtr&); void parseCameraInfo(const sensor_msgs::CameraInfoConstPtr&, cv::Mat&, cv::Mat&); tf::Transform aruco2tf(cv::Mat rvec, cv::Mat tvec); - -public: - ArucoPose() {}; - virtual ~ArucoPose() {}; }; void ArucoPose::onInit() { @@ -67,8 +57,6 @@ void ArucoPose::onInit() { pose_pub = nh_priv_.advertise("pose", 1); - publishVisualizationMarkers(); - ROS_INFO("aruco_pose nodelet inited"); } @@ -152,7 +140,7 @@ void ArucoPose::createBoard() else if (type == "custom") { // Not implemented yet - ROS_FATAL("Custom boards are not implemented yet.") + ROS_FATAL("Custom boards are not implemented yet."); } else { @@ -160,34 +148,6 @@ void ArucoPose::createBoard() } } -void ArucoPose::publishVisualizationMarkers() -{ - // Create latched publisher - static auto viz_markers_pub = nh_.advertise("viz", 1, true); - visualization_msgs::MarkerArray viz; - visualization_msgs::Marker marker; - marker.header.frame_id = "world"; - marker.type = visualization_msgs::Marker::CUBE; - marker.scale.x = 1; - marker.scale.y = 1; - marker.scale.z = 0.001; - marker.color.r = 1; - marker.color.g = 1; - marker.color.b = 1; - marker.color.a = 0.9; - marker.frame_locked = true; - viz.markers.push_back(marker); - marker.type = visualization_msgs::Marker::TEXT_VIEW_FACING; - marker.scale.z = 0.3; - marker.color.r = 0; - marker.color.g = 0; - marker.color.b = 0; - marker.color.a = 0.8; - marker.text = "240"; - viz.markers.push_back(marker); - viz_markers_pub.publish(viz); -} - cv::Point3f ArucoPose::getObjPointsCenter(cv::Mat objPoints) { float min_x = std::numeric_limits::max(); float max_x = std::numeric_limits::min(); @@ -217,75 +177,14 @@ void ArucoPose::detect(const sensor_msgs::ImageConstPtr& msg, const sensor_msgs: cv::Mat distCoeffs(8, 1, CV_64F); parseCameraInfo(cinfo, cameraMatrix, distCoeffs); - // std::cout << "dist " << distCoeffs << " mat " << cameraMatrix; - // std::cout << markerIds.size() << std::endl; - - // cv::Vec3d rvec, tvec; - // int valid = cv::aruco::estimatePoseBoard(markerCorners, markerIds, board, cameraMatrix, distCoeffs, rvec, tvec); - - // std::vector< cv::Vec3d > rvecs, tvecs; - //cv::aruco::estimatePoseSingleMarkers(markerCorners, 0.3362, cameraMatrix, distCoeffs, rvecs, tvecs); - // cv::aruco::estimatePoseSingleMarkers(markerCorners, 0.15, cameraMatrix, distCoeffs, rvecs, tvecs); - - - // Publish markers - // aruco_pose::MarkerArray markerArray; - // markerArray.header.frame_id = msg->header.frame_id; - // markerArray.header.stamp = msg->header.stamp; - // markerArray.markers.resize(markerIds.size()); - // for (int i = 0; i < markerIds.size(); i++) { - // markerArray.markers[i].id = markerIds[i]; - // markerArray.markers[i].pose.x = tvect[0]; - // markerArray.markers[i].pose.y = tvect[1]; - // markerArray.markers[i].pose.z = tvect[2]; - // markerArray.markers[i].header.stamp = msg->header.stamp; - // markerArray.markers[i].header.frame_id = msg->header.frame_id; - // } - // marker_pub.publish(markerArray); - - /* - for (int i = 0; i < markerIds.size(); i++) { - //if (markerIds[i] == 242) { - if (markerIds[i] == 9) { - tf::Transform transform = aruco2tf(rvecs[i], tvecs[i]); - tf::StampedTransform stampedTransform(transform, msg->header.stamp, msg->header.frame_id, frame_id); - br.sendTransform(stampedTransform); - - // geometry_msgs::TransformStamped transformStamped; - // transformStamped.header.stamp = msg->header.stamp; - // transformStamped.header.frame_id = cinfo->header.frame_id; - // transformStamped.child_frame_id = frame_id; - // transformStamped.transform = aruco2tf(rvecs[i], tvecs[i]); - // transformStamped.transform.translation = transformStamped.transform.translation.normalize(); - // br.sendTransform(transformStamped); - break; - } - } - */ - - // std::cout << "markers: "; - // for (auto const& c : markerIds) std::cout << c << ' '; - -// return; - if (markerIds.size() > 0) { -// for (auto const& c : markerCorners) std::cout << c << ' '; -// for (auto const& c : markerIds) std::cout << c << ' '; - -// cv::aruco::drawDetectedMarkers(image, markerCorners, markerIds); - - // std::vector< cv::Vec3d > rvecs, tvecs; - // cv::aruco::estimatePoseSingleMarkers(markerCorners, 0.3362, cameraMatrix, distCoeffs, rvecs, tvecs); - // draw axis for each marker - // for(int i=0; iheader.stamp, cinfo->header.frame_id, frame_id_); br.sendTransform(transform); @@ -296,7 +195,7 @@ void ArucoPose::detect(const sensor_msgs::ImageConstPtr& msg, const sensor_msgs: ps.pose.orientation.w = 1; pose_pub.publish(ps); - // Publish reference point + // Send reference point cv::Point3f ref = getObjPointsCenter(objPoints); tf::Vector3 ref_vector3 = tf::Vector3(ref.x, ref.y, ref.z); tf::Quaternion q(0, 0, 0); @@ -308,37 +207,15 @@ void ArucoPose::detect(const sensor_msgs::ImageConstPtr& msg, const sensor_msgs: ref_transform.setRotation(q); br.sendTransform(ref_transform); -// geometry_msgs::TransformStamped transformMsg; - // transform.header.stamp = msg->header.stamp; - // transform.header.frame_id = cinfo->header.frame_id; - // transform.child_frame_id = frame_id; - // transform.transform = aruco2tf(rvec, tvec); -// tf::transformStampedTFToMsg(transform, transformMsg); -// br.sendTransform(transformMsg); -// std::cout << rvec << ";" << tvec << std::endl; -// geometry_msgs::TransformStamped transformStamped; -// transformStamped.header.stamp = msg->header.stamp; -// transformStamped.header.frame_id = cinfo->header.frame_id; -// transformStamped.child_frame_id = frame_id; -// transformStamped.transform.translation.x = tvec[0]; -// transformStamped.transform.translation.y = tvec[1]; -// transformStamped.transform.translation.z = tvec[1]; -// transformStamped.transform.rotation.w = 1; -// br.sendTransform(transformStamped); - if(img_pub.getNumSubscribers() > 0) { - //show input with augmented information - // for(int i=0; iheader.frame_id; out_msg.header.stamp = msg->header.stamp; - out_msg.encoding = sensor_msgs::image_encodings::BGR8; // sensor_msgs::image_encodings::RGB8; + out_msg.encoding = sensor_msgs::image_encodings::BGR8; out_msg.image = image; img_pub.publish(out_msg.toImageMsg()); } @@ -362,14 +239,6 @@ tf::Transform ArucoPose::aruco2tf(cv::Mat rvec, cv::Mat tvec) { cv::Mat rot; cv::Rodrigues(rvec, rot); -// rot = rot.t(); // inverse rotation - //tvec = -rot * tvec; // translation of inverse - - // camPose is a 4x4 matrix with the pose of the camera in the object frame - // cv::Mat camPose = cv::Mat::eye(4, 4, R.type()); - // R.copyTo(camPose.rowRange(0, 3).colRange(0, 3)); // copies R into camPose - // tvec.copyTo(camPose.rowRange(0, 3).colRange(3, 4)); // copies tvec into camPose - tf::Matrix3x3 tf_rot(rot.at(0,0), rot.at(0,1), rot.at(0,2), rot.at(1,0), rot.at(1,1), rot.at(1,2), rot.at(2,0), rot.at(2,1), rot.at(2,2)); @@ -377,82 +246,6 @@ tf::Transform ArucoPose::aruco2tf(cv::Mat rvec, cv::Mat tvec) { return tf::Transform(tf_rot, tf_orig); } -/* -tf::Transform ArucoPose::aruco2tf(cv::Vec3d rvec, cv::Vec3d tvec) { - cv::Mat rot(3, 3, CV_64FC1); - // cv::Mat Rvec64; - // rvec.convertTo(rvec, CV_64FC1); - cv::Rodrigues(rvec, rot); - cv::Mat tran64; - // tvec.convertTo(tran64, CV_64FC1); - - cv::Mat rotate_to_ros(3, 3, CV_64FC1); - rotate_to_ros.at(0,0) = 1.0; - rotate_to_ros.at(0,1) = 0.0; - rotate_to_ros.at(0,2) = 0.0; - rotate_to_ros.at(1,0) = 0.0; - rotate_to_ros.at(1,1) = -1.0; - rotate_to_ros.at(1,2) = 0.0; - rotate_to_ros.at(2,0) = 0.0; - rotate_to_ros.at(2,1) = 0.0; - rotate_to_ros.at(2,2) = -1.0; - - rot = rot*rotate_to_ros.t(); - - tf::Matrix3x3 tf_rot(rot.at(0,0), rot.at(0,1), rot.at(0,2), - rot.at(1,0), rot.at(1,1), rot.at(1,2), - rot.at(2,0), rot.at(2,1), rot.at(2,2)); - - tf::Vector3 tf_orig(tvec[0], tvec[1], tvec[2]); - - - return tf::Transform(tf_rot, tf_orig); -} -*/ - -// tf::Transform ArucoPose::aruco2tf(cv::Vec3d rvec, cv::Vec3d tvec) { -// /* Code it based on https://github.com/Sahloul/ar_sys/blob/master/src/utils.cpp#L44 */ -// /* TODO: rewrite */ - -// cv::Mat rot(3, 3, CV_64FC1); -// cv::Rodrigues(rvec, rot); - -// cv::Mat rotate_to_sys(3, 3, CV_64FC1); -// /** -// /* Fixed the rotation to meet the ROS system -// /* Doing a basic rotation around X with theta=PI -// /* By Sahloul -// /* See http://en.wikipedia.org/wiki/Rotation_matrix for details -// */ - -// // 1 0 0 -// // 0 -1 0 -// // 0 0 -1 - -// rotate_to_sys.at(0,0) = 1.0; -// rotate_to_sys.at(0,1) = 0.0; -// rotate_to_sys.at(0,2) = 0.0; -// rotate_to_sys.at(1,0) = 0.0; -// rotate_to_sys.at(1,1) = -1.0; -// rotate_to_sys.at(1,2) = 0.0; -// rotate_to_sys.at(2,0) = 0.0; -// rotate_to_sys.at(2,1) = 0.0; -// rotate_to_sys.at(2,2) = -1.0; - -// rot = rot * rotate_to_sys.t(); - - -// tf::Matrix3x3 tf_rot(rot.at(0,0), rot.at(0,1), rot.at(0,2), -// rot.at(1,0), rot.at(1,1), rot.at(1,2), -// rot.at(2,0), rot.at(2,1), rot.at(2,2)); - -// tf::Vector3 tf_orig(tvec[0], tvec[1], tvec[2]); - -// tf::Transform tft(tf_rot, tf_orig); -// return tft; -// } - PLUGINLIB_EXPORT_CLASS(ArucoPose, nodelet::Nodelet) } - From 7b196e1776f564d85ae48898e95815863a4996ad Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 30 Nov 2017 00:44:48 +0300 Subject: [PATCH 060/149] +x for aruco_vpe --- clever/src/aruco_vpe.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 clever/src/aruco_vpe.py diff --git a/clever/src/aruco_vpe.py b/clever/src/aruco_vpe.py old mode 100644 new mode 100755 From 497182e5162b5fa5bad340c51918a2854dde18eb Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 30 Nov 2017 03:58:42 +0300 Subject: [PATCH 061/149] Fix sitl launch --- clever/launch/sitl.launch | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/clever/launch/sitl.launch b/clever/launch/sitl.launch index 27cb2055..94c0698b 100644 --- a/clever/launch/sitl.launch +++ b/clever/launch/sitl.launch @@ -8,8 +8,11 @@ - + + + + From 67520c02c93e38c5d549f4e18e8ee6f2489ec239 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 30 Nov 2017 03:59:15 +0300 Subject: [PATCH 062/149] Fix simple_offboard --- clever/src/simple_offboard.py | 1 + 1 file changed, 1 insertion(+) diff --git a/clever/src/simple_offboard.py b/clever/src/simple_offboard.py index cf62ef22..7c1fad06 100755 --- a/clever/src/simple_offboard.py +++ b/clever/src/simple_offboard.py @@ -272,6 +272,7 @@ def handle(req): try: with handle_lock: stamp = rospy.get_rostime() + current_req = req current_pub, current_msg = get_publisher_and_message(req, stamp) rospy.loginfo('Topic: %s, message: %s', current_pub.name, current_msg) From d2061236594c9c008ffb2f72aa8002b5375a4193 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Mon, 4 Dec 2017 02:33:06 +0300 Subject: [PATCH 063/149] aruco_pose: clear_params=true --- clever/launch/aruco.launch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clever/launch/aruco.launch b/clever/launch/aruco.launch index f9013c2d..b29a81af 100644 --- a/clever/launch/aruco.launch +++ b/clever/launch/aruco.launch @@ -2,7 +2,7 @@ - + From 42409a80a2a726a8f53439d6a91d8b4076317487 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Wed, 6 Dec 2017 05:53:43 +0300 Subject: [PATCH 064/149] `Navigate` service added --- clever/CMakeLists.txt | 1 + clever/src/simple_offboard.py | 75 +++++++++++++++++++++++++++++++--- clever/srv/Navigate.srv | 11 +++++ deploy/clever_arudino.tar.gz | Bin 185816 -> 186276 bytes 4 files changed, 82 insertions(+), 5 deletions(-) create mode 100644 clever/srv/Navigate.srv diff --git a/clever/CMakeLists.txt b/clever/CMakeLists.txt index 15929c58..579cf6bd 100644 --- a/clever/CMakeLists.txt +++ b/clever/CMakeLists.txt @@ -61,6 +61,7 @@ find_package(catkin REQUIRED COMPONENTS add_service_files( FILES GetTelemetry.srv + Navigate.srv SetPosition.srv SetPositionYawRate.srv SetPositionGlobal.srv diff --git a/clever/src/simple_offboard.py b/clever/src/simple_offboard.py index 7c1fad06..f1c309f8 100755 --- a/clever/src/simple_offboard.py +++ b/clever/src/simple_offboard.py @@ -131,11 +131,67 @@ ps = PoseStamped() vs = Vector3Stamped() -def get_publisher_and_message(req, stamp): +BRAKE_TIME = rospy.Duration(2) + + +def get_navigate_setpoint(stamp, start, finish, start_stamp, speed): + distance = math.sqrt((finish.z - start.z)**2 + (finish.x - start.x)**2 + (finish.y - start.y)**2) + time = rospy.Duration(distance / speed) + k = (stamp - start_stamp) / time + time_left = start_stamp + time - stamp + + if BRAKE_TIME and time_left < BRAKE_TIME: + # time to brake + time_before_braking = time - BRAKE_TIME + brake_time_passed = (stamp - start_stamp - time_before_braking) + + if brake_time_passed > 2 * BRAKE_TIME: + # finish + k = 1 + else: + # brake! + k_before_braking = time_before_braking / time + k_after_braking = (speed * brake_time_passed.to_sec() - brake_time_passed.to_sec() ** 2 * speed / 4 / BRAKE_TIME.to_sec()) / distance + k = k_before_braking + k_after_braking + + k = min(k, 1) + + p = Point() + p.x = start.x + (finish.x - start.x) * k + p.y = start.y + (finish.y - start.y) * k + p.z = start.z + (finish.z - start.z) * k + return p + + +def get_publisher_and_message(req, stamp, continued=True, update_frame=True): ps.header.stamp = stamp vs.header.stamp = stamp - if isinstance(req, srv.SetPositionRequest): + if isinstance(req, srv.NavigateRequest): + global current_nav_start, current_nav_start_stamp, current_nav_finish + + if update_frame: + ps.header.frame_id = req.frame_id or 'local_origin' + ps.pose.position = Point(req.x, req.y, req.z) + ps.pose.orientation = orientation_from_euler(0, 0, req.yaw) + current_nav_finish = tf_buffer.transform(ps, 'local_origin', TRANSFORM_TIMEOUT) + + if not continued: + current_nav_start = pose.pose.position + current_nav_start_stamp = stamp + + setpoint = get_navigate_setpoint(stamp, current_nav_start, current_nav_finish.pose.position, + current_nav_start_stamp, req.speed) + + msg = PositionTarget(coordinate_frame=PositionTarget.FRAME_LOCAL_NED, + type_mask=PositionTarget.IGNORE_VX + PositionTarget.IGNORE_VY + PositionTarget.IGNORE_VZ + + PositionTarget.IGNORE_AFX + PositionTarget.IGNORE_AFY + PositionTarget.IGNORE_AFZ + + PositionTarget.IGNORE_YAW_RATE, + position=setpoint, + yaw=euler_from_orientation(current_nav_finish.pose.orientation)[2] - math.pi / 2) + return position_pub, msg + + elif isinstance(req, srv.SetPositionRequest): ps.header.frame_id = req.frame_id or 'local_origin' ps.pose.position = Point(req.x, req.y, req.z) ps.pose.orientation = orientation_from_euler(0, 0, req.yaw) @@ -260,6 +316,9 @@ def get_publisher_and_message(req, stamp): current_pub = None current_msg = None current_req = None +current_nav_start = None +current_nav_finish = None +current_nav_start_stamp = None handle_lock = Lock() @@ -269,11 +328,15 @@ def handle(req): if not state.connected: return {'message': 'No connection to the FCU'} + if isinstance(req, srv.NavigateRequest) and req.speed <= 0: + rospy.logwarn('Navigate speed must be greater than zero, %s passed') + return {'message': 'Navigate speed must be greater than zero, %s passed' % req.speed} + try: with handle_lock: stamp = rospy.get_rostime() current_req = req - current_pub, current_msg = get_publisher_and_message(req, stamp) + current_pub, current_msg = get_publisher_and_message(req, stamp, False) rospy.loginfo('Topic: %s, message: %s', current_pub.name, current_msg) current_msg.header.stamp = stamp @@ -296,6 +359,7 @@ def release(req): return {'success': True} +rospy.Service('navigate', srv.Navigate, handle) rospy.Service('set_position', srv.SetPosition, handle) rospy.Service('set_position/yaw_rate', srv.SetPositionYawRate, handle) rospy.Service('set_position_global', srv.SetPositionGlobal, handle) @@ -386,8 +450,9 @@ def start_loop(): try: stamp = rospy.get_rostime() - if getattr(current_req, 'update_frame', False): - current_pub, current_msg = get_publisher_and_message(current_req, stamp) + if getattr(current_req, 'update_frame', False) or isinstance(current_req, srv.NavigateRequest): + current_pub, current_msg = get_publisher_and_message(current_req, stamp, True, + getattr(current_req, 'update_frame', False)) current_msg.header.stamp = stamp current_pub.publish(current_msg) diff --git a/clever/srv/Navigate.srv b/clever/srv/Navigate.srv new file mode 100644 index 00000000..e368f284 --- /dev/null +++ b/clever/srv/Navigate.srv @@ -0,0 +1,11 @@ +float32 x +float32 y +float32 z +float32 yaw +float32 speed +string frame_id +bool update_frame +bool auto_arm +--- +bool success +string message diff --git a/deploy/clever_arudino.tar.gz b/deploy/clever_arudino.tar.gz index 8be567f433fb4c6de385ab1cb5a76e70a105ccfe..df92e77ae50dfa1b5cff36330914b33876126bc8 100644 GIT binary patch delta 181119 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 delta 180687 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

$;>;OrGWo@nRpJFtCJY?> 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

v1VJkYZXlaZl#$BVo(2T8d%ixXf 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 From 56eea04a8620dd9b91d0e29230607645088ca835 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Wed, 6 Dec 2017 05:54:21 +0300 Subject: [PATCH 065/149] /simple_offboard/target topic (for monitoring target) --- clever/src/simple_offboard.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/clever/src/simple_offboard.py b/clever/src/simple_offboard.py index f1c309f8..dcac5a6f 100755 --- a/clever/src/simple_offboard.py +++ b/clever/src/simple_offboard.py @@ -50,6 +50,8 @@ init_fcu_horiz() position_pub = rospy.Publisher('/mavros/setpoint_raw/local', PositionTarget, queue_size=1) attitude_pub = rospy.Publisher('/mavros/setpoint_raw/attitude', AttitudeTarget, queue_size=1) +target_pub = rospy.Publisher('~target', PoseStamped, queue_size=1) + arming = rospy.ServiceProxy('/mavros/cmd/arming', CommandBool) set_mode = rospy.ServiceProxy('/mavros/set_mode', SetMode) @@ -457,6 +459,15 @@ def start_loop(): current_msg.header.stamp = stamp current_pub.publish(current_msg) + # For monitoring + if isinstance(current_msg, PositionTarget): + p = PoseStamped() + p.header.frame_id = 'local_origin' + p.header.stamp = stamp + p.pose.position = current_msg.position + p.pose.orientation = orientation_from_euler(0, 0, current_msg.yaw) + target_pub.publish(p) + except Exception as e: rospy.logwarn_throttle(10, str(e)) From 07d42dce3582de3da754e98da5a99741ca30fce2 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Wed, 6 Dec 2017 05:54:34 +0300 Subject: [PATCH 066/149] Note for setting up larger camera FPS --- clever/launch/bottom_camera.launch | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/clever/launch/bottom_camera.launch b/clever/launch/bottom_camera.launch index 65beb928..6c6d8c38 100644 --- a/clever/launch/bottom_camera.launch +++ b/clever/launch/bottom_camera.launch @@ -10,6 +10,11 @@ + + + + + From 2711b65a2531c6cd238ea22757fb60e13ad37ced Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Wed, 6 Dec 2017 06:15:39 +0300 Subject: [PATCH 067/149] simple_offboard/target yaw fix --- clever/src/simple_offboard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clever/src/simple_offboard.py b/clever/src/simple_offboard.py index dcac5a6f..2375a4ff 100755 --- a/clever/src/simple_offboard.py +++ b/clever/src/simple_offboard.py @@ -465,7 +465,7 @@ def start_loop(): p.header.frame_id = 'local_origin' p.header.stamp = stamp p.pose.position = current_msg.position - p.pose.orientation = orientation_from_euler(0, 0, current_msg.yaw) + p.pose.orientation = orientation_from_euler(0, 0, current_msg.yaw + math.pi / 2) target_pub.publish(p) except Exception as e: From d27719e16e58502e04c8da8ca7906dc8efd1c718 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Wed, 6 Dec 2017 20:49:29 +0300 Subject: [PATCH 068/149] Adjust nodelet_manager num_worker_threads --- clever/launch/bottom_camera.launch | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/clever/launch/bottom_camera.launch b/clever/launch/bottom_camera.launch index 6c6d8c38..fcef5b06 100644 --- a/clever/launch/bottom_camera.launch +++ b/clever/launch/bottom_camera.launch @@ -1,5 +1,7 @@ - + + + From 96657a99e1f1aff9b8d54bb6ad49b35cb1aa5d41 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 7 Dec 2017 01:16:30 +0300 Subject: [PATCH 069/149] aruco_map -> aruco_map_vision; vpe_origin -> aruco_map --- clever/src/aruco_vpe.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/clever/src/aruco_vpe.py b/clever/src/aruco_vpe.py index 198bb846..a5e589e1 100755 --- a/clever/src/aruco_vpe.py +++ b/clever/src/aruco_vpe.py @@ -55,20 +55,20 @@ def publish_vpe(pose): aruco_map_in_reference = lookup_transform('aruco_map_reference', 'aruco_map_raw') aruco_map_in_reference.header.frame_id = 'aruco_map_reference_horiz' - send_transform(aruco_map_in_reference, 'aruco_map') + send_transform(aruco_map_in_reference, 'aruco_map_vision') # Reset VPE if last_published is None or stamp - last_published > rospy.Duration(2): rospy.loginfo('Reset VPE') - aruco_map_in_local_origin = lookup_transform('local_origin', 'aruco_map') - aruco_map_in_local_origin.child_frame_id = 'vpe_origin' + aruco_map_in_local_origin = lookup_transform('local_origin', 'aruco_map_vision') + aruco_map_in_local_origin.child_frame_id = 'aruco_map' static_tf_broadcaster.sendTransform(aruco_map_in_local_origin) # Calculate VPE ps.header.frame_id = 'fcu_horiz' ps.header.stamp = stamp - vpe_raw = tf_buffer.transform(ps, 'aruco_map', LOOKUP_TIMEOUT) - vpe_raw.header.frame_id = 'vpe_origin' + vpe_raw = tf_buffer.transform(ps, 'aruco_map_vision', LOOKUP_TIMEOUT) + vpe_raw.header.frame_id = 'aruco_map' vpe = tf_buffer.transform(vpe_raw, 'local_origin', LOOKUP_TIMEOUT) _vision_position_pub.publish(vpe_raw) vision_position_pub.publish(vpe) From 30b488010f7797d44fc397fed5fbf5d1b6b97dd3 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 7 Dec 2017 01:16:59 +0300 Subject: [PATCH 070/149] Post vpe 0:0:0 if no local position to initialize it --- clever/src/aruco_vpe.py | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/clever/src/aruco_vpe.py b/clever/src/aruco_vpe.py index a5e589e1..e9d6ca26 100755 --- a/clever/src/aruco_vpe.py +++ b/clever/src/aruco_vpe.py @@ -40,10 +40,15 @@ def send_transform(transform, child_frame_id): tf_broadcaster.sendTransform(transform) +vpe_posted = False + + def publish_vpe(pose): - global last_published stamp = pose.header.stamp + global last_published, vpe_posted + vpe_posted = True + def lookup_transform(target_frame, source_frame): return tf_buffer.lookup_transform(target_frame, source_frame, stamp, LOOKUP_TIMEOUT) @@ -76,5 +81,26 @@ def publish_vpe(pose): rospy.Subscriber('aruco_pose/pose', PoseStamped, publish_vpe, queue_size=1) + + +local_pose = None + + +def handle_pose(data): + global local_pose + local_pose = data + + +rospy.Subscriber('mavros/local_position/pose', PoseStamped, handle_pose, queue_size=1) + + rospy.loginfo('aruco_vpe inited') -rospy.spin() +r = rospy.Rate(5) + + +while not rospy.is_shutdown(): + if not vpe_posted and not local_pose: + ps.header.stamp = rospy.get_rostime() + vision_position_pub.publish(ps) + + r.sleep() From 5d8aa13d62fb20629a820c7ae3dcec3e7f596d72 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 7 Dec 2017 01:17:08 +0300 Subject: [PATCH 071/149] Increase brake time --- clever/src/simple_offboard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clever/src/simple_offboard.py b/clever/src/simple_offboard.py index 2375a4ff..ef04017f 100755 --- a/clever/src/simple_offboard.py +++ b/clever/src/simple_offboard.py @@ -133,7 +133,7 @@ ps = PoseStamped() vs = Vector3Stamped() -BRAKE_TIME = rospy.Duration(2) +BRAKE_TIME = rospy.Duration(2.5) def get_navigate_setpoint(stamp, start, finish, start_stamp, speed): From 1a6e376b1e069700b572f936f8b54e28e926cc57 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 7 Dec 2017 01:18:26 +0300 Subject: [PATCH 072/149] bottom_camera_optical shift --- clever/launch/bottom_camera.launch | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clever/launch/bottom_camera.launch b/clever/launch/bottom_camera.launch index fcef5b06..81f50599 100644 --- a/clever/launch/bottom_camera.launch +++ b/clever/launch/bottom_camera.launch @@ -5,8 +5,8 @@ - - + + From df1ae9e74863ee8ad4ae699d6bdd3966355716e8 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 7 Dec 2017 01:19:26 +0300 Subject: [PATCH 073/149] Always publish /aruco_pose/debug --- aruco_pose/src/aruco_pose.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/aruco_pose/src/aruco_pose.cpp b/aruco_pose/src/aruco_pose.cpp index 77f17d80..54eeaf5d 100644 --- a/aruco_pose/src/aruco_pose.cpp +++ b/aruco_pose/src/aruco_pose.cpp @@ -212,15 +212,19 @@ void ArucoPose::detect(const sensor_msgs::ImageConstPtr& msg, const sensor_msgs: // Publish debug image cv::aruco::drawDetectedMarkers(image, markerCorners, markerIds); cv::aruco::drawAxis(image, cameraMatrix, distCoeffs, rvec, tvec, 0.3); - cv_bridge::CvImage out_msg; - out_msg.header.frame_id = msg->header.frame_id; - out_msg.header.stamp = msg->header.stamp; - out_msg.encoding = sensor_msgs::image_encodings::BGR8; - out_msg.image = image; - img_pub.publish(out_msg.toImageMsg()); } } } + + if (img_pub.getNumSubscribers() > 0) + { + cv_bridge::CvImage out_msg; + out_msg.header.frame_id = msg->header.frame_id; + out_msg.header.stamp = msg->header.stamp; + out_msg.encoding = sensor_msgs::image_encodings::BGR8; + out_msg.image = image; + img_pub.publish(out_msg.toImageMsg()); + } } void ArucoPose::parseCameraInfo(const sensor_msgs::CameraInfoConstPtr &cinfo, cv::Mat &cameraMat, cv::Mat &distCoeffs) { From 0b045038ce6b6de5cb5b1bbf05a0a5a7cd6f5565 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 7 Dec 2017 02:18:35 +0300 Subject: [PATCH 074/149] Post 0:0:0 vision pose everytime until normal vpe is posted --- clever/src/aruco_vpe.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clever/src/aruco_vpe.py b/clever/src/aruco_vpe.py index e9d6ca26..29c1ab78 100755 --- a/clever/src/aruco_vpe.py +++ b/clever/src/aruco_vpe.py @@ -99,7 +99,7 @@ r = rospy.Rate(5) while not rospy.is_shutdown(): - if not vpe_posted and not local_pose: + if not vpe_posted: ps.header.stamp = rospy.get_rostime() vision_position_pub.publish(ps) From fc2c8168ac40901844f69b37df820b6d0a3b6dcb Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 7 Dec 2017 02:18:51 +0300 Subject: [PATCH 075/149] simple_offboard: use persistent connection to arming and set_mode services --- clever/src/simple_offboard.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clever/src/simple_offboard.py b/clever/src/simple_offboard.py index ef04017f..83a9b8cd 100755 --- a/clever/src/simple_offboard.py +++ b/clever/src/simple_offboard.py @@ -52,8 +52,8 @@ position_pub = rospy.Publisher('/mavros/setpoint_raw/local', PositionTarget, que attitude_pub = rospy.Publisher('/mavros/setpoint_raw/attitude', AttitudeTarget, queue_size=1) target_pub = rospy.Publisher('~target', PoseStamped, queue_size=1) -arming = rospy.ServiceProxy('/mavros/cmd/arming', CommandBool) -set_mode = rospy.ServiceProxy('/mavros/set_mode', SetMode) +arming = rospy.ServiceProxy('/mavros/cmd/arming', CommandBool, persistent=True) +set_mode = rospy.ServiceProxy('/mavros/set_mode', SetMode, persistent=True) pose = None From 1e6922cc28a2d0ca6dc513d015b2e7f34a5ea6bf Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 7 Dec 2017 02:23:40 +0300 Subject: [PATCH 076/149] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 367a1369..adac150a 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,8 @@ https://copterexpress.gitbooks.io/clever/content/ +**Готовый образ** с предустановленным и преднастроенным clever_bundle можно скачать [здесь](https://copterexpress.gitbooks.io/clever/content/docs/microsd_images.html). + Установка --------- From 82694ddc5f9bf1b7ef55e2cf140641ca26a3928b Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 7 Dec 2017 02:23:58 +0300 Subject: [PATCH 077/149] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index adac150a..ab76c075 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ https://copterexpress.gitbooks.io/clever/content/ -**Готовый образ** с предустановленным и преднастроенным clever_bundle можно скачать [здесь](https://copterexpress.gitbooks.io/clever/content/docs/microsd_images.html). +**Готовый образ** для RPi 3 с предустановленным и преднастроенным clever_bundle можно скачать [здесь](https://copterexpress.gitbooks.io/clever/content/docs/microsd_images.html). Установка --------- From d347b710fb0c8485ae9b34fe775c67a860015ef3 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 7 Dec 2017 02:25:13 +0300 Subject: [PATCH 078/149] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index ab76c075..cf30003e 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,8 @@ https://copterexpress.gitbooks.io/clever/content/ **Готовый образ** для RPi 3 с предустановленным и преднастроенным clever_bundle можно скачать [здесь](https://copterexpress.gitbooks.io/clever/content/docs/microsd_images.html). +[Описание API](https://copterexpress.gitbooks.io/clever/content/docs/simple_offboard.html) для автономных полетов. + Установка --------- From 09dd32a6ce9c1a3e9de79e365ba0d584ca135309 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Sun, 10 Dec 2017 03:08:39 +0300 Subject: [PATCH 079/149] =?UTF-8?q?Continue=20=C2=ABfixing=C2=BB=20weird?= =?UTF-8?q?=20bugs=20in=20aruco=20functions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aruco_pose/src/aruco_pose.cpp | 6 +-- aruco_pose/src/fix.cpp | 84 +++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 3 deletions(-) diff --git a/aruco_pose/src/aruco_pose.cpp b/aruco_pose/src/aruco_pose.cpp index 54eeaf5d..7723dd35 100644 --- a/aruco_pose/src/aruco_pose.cpp +++ b/aruco_pose/src/aruco_pose.cpp @@ -91,6 +91,8 @@ cv::Ptr createCustomBoard(int markersX, int markersY, float ma return res; } +#include "fix.cpp" + void ArucoPose::createBoard() { static auto map_image_pub = nh_priv_.advertise("map_image", 1, true); @@ -129,7 +131,7 @@ void ArucoPose::createBoard() } // Publish map image for debugging - cv::aruco::drawPlanarBoard(board, cv::Size(2000, 2000), map_image, 50, 1); + _drawPlanarBoard(board, cv::Size(2000, 2000), map_image, 50, 1); cv::cvtColor(map_image, map_image, CV_GRAY2BGR); @@ -162,8 +164,6 @@ cv::Point3f ArucoPose::getObjPointsCenter(cv::Mat objPoints) { return res; } -#include "fix.cpp" - void ArucoPose::detect(const sensor_msgs::ImageConstPtr& msg, const sensor_msgs::CameraInfoConstPtr &cinfo) { cv::Mat image = cv_bridge::toCvShare(msg, "bgr8")->image; diff --git a/aruco_pose/src/fix.cpp b/aruco_pose/src/fix.cpp index 294ff569..c15bf3b7 100644 --- a/aruco_pose/src/fix.cpp +++ b/aruco_pose/src/fix.cpp @@ -1,4 +1,5 @@ using namespace cv; +using namespace cv::aruco; // Temporal fix! // TODO: remove @@ -59,3 +60,86 @@ int _estimatePoseBoard(InputArrayOfArrays _corners, InputArray _ids, const Ptr 0); + CV_Assert(marginSize >= 0); + + _img.create(outSize, CV_8UC1); + Mat out = _img.getMat(); + out.setTo(Scalar::all(255)); + out.adjustROI(-marginSize, -marginSize, -marginSize, -marginSize); + + // calculate max and min values in XY plane + CV_Assert(_board->objPoints.size() > 0); + float minX, maxX, minY, maxY; + minX = maxX = _board->objPoints[0][0].x; + minY = maxY = _board->objPoints[0][0].y; + + for(unsigned int i = 0; i < _board->objPoints.size(); i++) { + for(int j = 0; j < 4; j++) { + minX = min(minX, _board->objPoints[i][j].x); + maxX = max(maxX, _board->objPoints[i][j].x); + minY = min(minY, _board->objPoints[i][j].y); + maxY = max(maxY, _board->objPoints[i][j].y); + } + } + + float sizeX = maxX - minX; + float sizeY = maxY - minY; + + // proportion transformations + float xReduction = sizeX / float(out.cols); + float yReduction = sizeY / float(out.rows); + + // determine the zone where the markers are placed + if(xReduction > yReduction) { + int nRows = int(sizeY / xReduction); + int rowsMargins = (out.rows - nRows) / 2; + out.adjustROI(-rowsMargins, -rowsMargins, 0, 0); + } else { + int nCols = int(sizeX / yReduction); + int colsMargins = (out.cols - nCols) / 2; + out.adjustROI(0, 0, -colsMargins, -colsMargins); + } + + // now paint each marker + Dictionary &dictionary = *(_board->dictionary); + Mat marker; + Point2f outCorners[3]; + Point2f inCorners[3]; + for(unsigned int m = 0; m < _board->objPoints.size(); m++) { + // transform corners to markerZone coordinates + for(int j = 0; j < 3; j++) { + Point2f pf = Point2f(_board->objPoints[m][j].x, _board->objPoints[m][j].y); + // move top left to 0, 0 + pf -= Point2f(minX, minY); + pf.x = pf.x / sizeX * float(out.cols); + pf.y = (1.0f - pf.y / sizeY) * float(out.rows); + outCorners[j] = pf; + } + + // get marker + Size dst_sz(outCorners[2] - outCorners[0]); // assuming CCW order + dst_sz.width = dst_sz.height = std::min(dst_sz.width, dst_sz.height); //marker should be square + dictionary.drawMarker(_board->ids[m], dst_sz.width, marker, borderBits); + + if((outCorners[0].y == outCorners[1].y) && (outCorners[1].x == outCorners[2].x)) { + // marker is aligned to image axes + marker.copyTo(out(Rect(outCorners[0], dst_sz))); + continue; + } + + // interpolate tiny marker to marker position in markerZone + inCorners[0] = Point2f(-0.5f, -0.5f); + inCorners[1] = Point2f(marker.cols - 0.5f, -0.5f); + inCorners[2] = Point2f(marker.cols - 0.5f, marker.rows - 0.5f); + + // remove perspective + Mat transformation = getAffineTransform(inCorners, outCorners); + warpAffine(marker, out, transformation, out.size(), INTER_LINEAR, + BORDER_TRANSPARENT); + } +} From 3c0529d5c0dc3c3a071b6e0c09f56319922d3a0e Mon Sep 17 00:00:00 2001 From: 4ert Date: Mon, 11 Dec 2017 19:50:46 +0300 Subject: [PATCH 080/149] Adding handler which returns ip address and a signal strength of a wifi client --- clever/src/web_server.py | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/clever/src/web_server.py b/clever/src/web_server.py index 4ea47451..86874760 100755 --- a/clever/src/web_server.py +++ b/clever/src/web_server.py @@ -1,12 +1,12 @@ #!/usr/bin/env python import rospy -from flask import Flask, send_from_directory, send_file - +import subprocess +import re +from flask import Flask, send_from_directory, send_file, request, jsonify rospy.init_node('web_server', disable_signals=True) - port = rospy.get_param('~port', 7070) host = rospy.get_param('~host', '0.0.0.0') serve_path = rospy.get_param('~path') @@ -24,5 +24,37 @@ def serve_static(path): return send_from_directory(serve_path, path) +@app.route('/wifi_data/') +def get_wifi_data(): + cur_ip = request.remote_addr + ip_signal = get_ip_signal() + return jsonify({'ip': cur_ip, 'signal': ip_signal[cur_ip]}), 200 + + +def get_ip_signal(): + wlan_interface = 'wlan0' + # Getting info about wifi client connected to access point. From here we know MAC and signal level + iwl = subprocess.check_output(['sudo', 'iw', 'dev', 'wlan0', 'station', 'dump']).splitlines() + mac_signal = {} + cur_client = '' + for line in iwl: + if line.find('Station') != -1: + cur_client = re.search(r'([0-9A-F]{2}[:-]){5}([0-9A-F]{2})', line, re.I).group() + if line.find('signal') != -1: + sg = re.search(r'(\[-?\d*\])', line, re.I).group() + mac_signal[cur_client] = re.sub(r'[\[\]]', '', sg) + ip_signal = {} + # Getting ip-mac mapping + ip_mac = subprocess.check_output(['arp', '-i', wlan_interface]).splitlines() + for line in ip_mac: + mac = re.search(r'([0-9A-F]{2}[:-]){5}([0-9A-F]{2})', line, re.I) + if mac is not None: + mac = mac.group() + if mac in mac_signal: + ips = re.search(r'((2[0-5]|1[0-9]|[0-9])?[0-9]\.){3}((2[0-5]|1[0-9]|[0-9])?[0-9])', line, re.I).group() + ip_signal[ips] = mac_signal[mac] + return ip_signal + + rospy.loginfo('Serving on %s:%s', host, port) app.run(host=host, port=port, threaded=True) From 2c651983256393ad6328ae65cc146f75c85b711b Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Mon, 11 Dec 2017 20:19:48 +0300 Subject: [PATCH 081/149] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index cf30003e..3e147258 100644 --- a/README.md +++ b/README.md @@ -45,8 +45,11 @@ sudo systemctl start clever Зависимости ----------- +ROS Kinetic. + Необходимые для работы ROS-пакеты: +* `opencv3` * `mavros` * `rosbridge_suite` * `web_video_server` From c425a6c1f0a38ec4515f8709206b023d0ca58eee Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Mon, 11 Dec 2017 20:57:41 +0300 Subject: [PATCH 082/149] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3e147258..4fa3c0eb 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ sudo systemctl start clever Зависимости ----------- -ROS Kinetic. +[ROS Kinetic](http://wiki.ros.org/kinetic). Необходимые для работы ROS-пакеты: From 47a57d263124956fdbb4e61928b6851b766d44d7 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Wed, 13 Dec 2017 21:18:57 +0300 Subject: [PATCH 083/149] Increase bottom camera FPS --- clever/launch/bottom_camera.launch | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/clever/launch/bottom_camera.launch b/clever/launch/bottom_camera.launch index 81f50599..73748782 100644 --- a/clever/launch/bottom_camera.launch +++ b/clever/launch/bottom_camera.launch @@ -11,11 +11,10 @@ - - - - + + + From f3e8e939587d85cbf3396170ba58a500ca73567f Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Wed, 13 Dec 2017 21:19:10 +0300 Subject: [PATCH 084/149] clear_params=true --- clever/launch/bottom_camera.launch | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clever/launch/bottom_camera.launch b/clever/launch/bottom_camera.launch index 73748782..30fc77f2 100644 --- a/clever/launch/bottom_camera.launch +++ b/clever/launch/bottom_camera.launch @@ -1,5 +1,5 @@ - + @@ -8,7 +8,7 @@ - + From 6803a03578c9fc475435fe4d490e20696d1287d2 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Wed, 13 Dec 2017 21:20:00 +0300 Subject: [PATCH 085/149] required=false for web_video_server --- clever/launch/clever.launch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clever/launch/clever.launch b/clever/launch/clever.launch index 9f876e56..d916fa6b 100644 --- a/clever/launch/clever.launch +++ b/clever/launch/clever.launch @@ -24,7 +24,7 @@ - + From 286a68509562a5f1bcc01e552a537469141c4510 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Wed, 13 Dec 2017 21:20:22 +0300 Subject: [PATCH 086/149] Decrease lookup timeout for aruco_vpe --- clever/src/aruco_vpe.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clever/src/aruco_vpe.py b/clever/src/aruco_vpe.py index 29c1ab78..aaadbd6a 100755 --- a/clever/src/aruco_vpe.py +++ b/clever/src/aruco_vpe.py @@ -12,7 +12,7 @@ from util import orientation_from_euler, euler_from_orientation rospy.init_node('aruco_vpe') -LOOKUP_TIMEOUT = rospy.Duration(.1) +LOOKUP_TIMEOUT = rospy.Duration(.05) CAMERA_FRAME_ID = rospy.get_param('~camera_frame_id', 'bottom_camera_optical') From 7ac28f5f68ac459aa34b213baa2b1af5c2b47ce7 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Fri, 15 Dec 2017 00:20:26 +0300 Subject: [PATCH 087/149] Increase camera rate limit to 100 (and fix some camera buffering bug) --- clever/launch/bottom_camera.launch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clever/launch/bottom_camera.launch b/clever/launch/bottom_camera.launch index 30fc77f2..5662c4f0 100644 --- a/clever/launch/bottom_camera.launch +++ b/clever/launch/bottom_camera.launch @@ -13,7 +13,7 @@ - + From 4d26cdf50682b66ba1ebebbb8521650d58054fd2 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Fri, 15 Dec 2017 00:27:48 +0300 Subject: [PATCH 088/149] Disable FPV camera by default --- clever/launch/clever.launch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clever/launch/clever.launch b/clever/launch/clever.launch index d916fa6b..a3fa16e3 100644 --- a/clever/launch/clever.launch +++ b/clever/launch/clever.launch @@ -8,7 +8,7 @@ - + From 648348bfb59342a4fc157523161aa0699331eb19 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Fri, 15 Dec 2017 00:28:17 +0300 Subject: [PATCH 089/149] Disable some of the mavros plugins --- clever/launch/mavros.launch | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/clever/launch/mavros.launch b/clever/launch/mavros.launch index 64e508b1..c3091bcf 100644 --- a/clever/launch/mavros.launch +++ b/clever/launch/mavros.launch @@ -26,4 +26,22 @@ + + - safety_area + - image_pub + - vibration + - distance_sensor + - rangefinder + - 3dr_radio + - actuator_control + - hil_controls + - manual_control + - vfr_hud + - px4flow + - vision_speed_estimate + - fake_gps + - cam_imu_sync + - hil + - adsb + From f1b4d7fe26f0751ea4a071e61af7fbe475d824e3 Mon Sep 17 00:00:00 2001 From: Oleg Apostol Date: Fri, 15 Dec 2017 13:24:43 +0300 Subject: [PATCH 090/149] =?UTF-8?q?=F0=9F=93=A6=20=20Add=20web-rc=20bundle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitmodules | 4 ++++ clever/static | 1 + 2 files changed, 5 insertions(+) create mode 100644 .gitmodules create mode 160000 clever/static diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..d78ff0b3 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "clever/static"] + path = clever/static + url = https://github.com/CopterExpress/clever-rc.git + branch = build diff --git a/clever/static b/clever/static new file mode 160000 index 00000000..0ec80bbc --- /dev/null +++ b/clever/static @@ -0,0 +1 @@ +Subproject commit 0ec80bbccf1d1617118ec4a8b7c7fe9ca5abe5b3 From e01fcf1b7487b4052bdef4b69e4100f10f5ee381 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Sun, 17 Dec 2017 22:01:59 +0300 Subject: [PATCH 091/149] Remove braking by default --- clever/src/simple_offboard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clever/src/simple_offboard.py b/clever/src/simple_offboard.py index 83a9b8cd..9c4c8061 100755 --- a/clever/src/simple_offboard.py +++ b/clever/src/simple_offboard.py @@ -133,7 +133,7 @@ ps = PoseStamped() vs = Vector3Stamped() -BRAKE_TIME = rospy.Duration(2.5) +BRAKE_TIME = rospy.Duration(0) def get_navigate_setpoint(stamp, start, finish, start_stamp, speed): From 23b9bb8bea35565f7c7a78385e4d196507c69bdd Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Tue, 19 Dec 2017 03:36:26 +0300 Subject: [PATCH 092/149] Rewrite `fcu_horiz` publisher in C++ as a nodelet --- clever/CMakeLists.txt | 20 ++++++++++++-------- clever/launch/clever.launch | 2 ++ clever/nodelet_plugins.xml | 5 +++++ clever/package.xml | 6 ++++++ clever/src/fcu_horiz.cpp | 31 +++++++++++++++++++++++++++++++ clever/src/simple_offboard.py | 20 -------------------- 6 files changed, 56 insertions(+), 28 deletions(-) create mode 100644 clever/nodelet_plugins.xml create mode 100644 clever/src/fcu_horiz.cpp diff --git a/clever/CMakeLists.txt b/clever/CMakeLists.txt index 579cf6bd..523d79ca 100644 --- a/clever/CMakeLists.txt +++ b/clever/CMakeLists.txt @@ -2,12 +2,15 @@ cmake_minimum_required(VERSION 2.8.3) project(clever) ## Compile as C++11, supported in ROS Kinetic and newer -# add_compile_options(-std=c++11) +add_compile_options(-std=c++11) ## Find catkin macros and libraries ## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz) ## is used, also find other catkin packages find_package(catkin REQUIRED COMPONENTS + nodelet + pluginlib + roscpp rospy std_msgs message_generation @@ -131,13 +134,13 @@ catkin_package( ## Your package locations should be listed before other locations include_directories( # include -# ${catkin_INCLUDE_DIRS} + ${catkin_INCLUDE_DIRS} ) ## Declare a C++ library -# add_library(${PROJECT_NAME} -# src/${PROJECT_NAME}/clever.cpp -# ) +add_library(fcu_horiz + src/fcu_horiz.cpp +) ## Add cmake target dependencies of the library ## as an example, code may need to be generated before libraries @@ -160,9 +163,10 @@ include_directories( # add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) ## Specify libraries to link a library or executable target against -# target_link_libraries(${PROJECT_NAME}_node -# ${catkin_LIBRARIES} -# ) +target_link_libraries(fcu_horiz + ${catkin_LIBRARIES} + "/opt/ros/kinetic/lib/libtf2_ros.so" +) ############# ## Install ## diff --git a/clever/launch/clever.launch b/clever/launch/clever.launch index a3fa16e3..e53cb5b5 100644 --- a/clever/launch/clever.launch +++ b/clever/launch/clever.launch @@ -28,6 +28,8 @@ + + diff --git a/clever/nodelet_plugins.xml b/clever/nodelet_plugins.xml new file mode 100644 index 00000000..86ef931a --- /dev/null +++ b/clever/nodelet_plugins.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/clever/package.xml b/clever/package.xml index b41ce0f3..5759150f 100644 --- a/clever/package.xml +++ b/clever/package.xml @@ -41,9 +41,15 @@ catkin + nodelet + roscpp + + nodelet + roscpp + diff --git a/clever/src/fcu_horiz.cpp b/clever/src/fcu_horiz.cpp new file mode 100644 index 00000000..4dd4adc0 --- /dev/null +++ b/clever/src/fcu_horiz.cpp @@ -0,0 +1,31 @@ +#include +#include +#include +#include +#include + +class FcuHoriz : public nodelet::Nodelet +{ + geometry_msgs::TransformStamped t_; + + void handlePose(const geometry_msgs::PoseStampedConstPtr& msg) + { + static tf2_ros::TransformBroadcaster br; + t_.header.stamp = msg->header.stamp; + t_.header.frame_id = msg->header.frame_id; + t_.transform.translation.x = msg->pose.position.x; + t_.transform.translation.y = msg->pose.position.y; + t_.transform.translation.z = msg->pose.position.z; + br.sendTransform(t_); + } + + void onInit() + { + t_.child_frame_id = "fcu_horiz"; + t_.transform.rotation.w = 1; + static ros::Subscriber pose_sub = getNodeHandle().subscribe("mavros/local_position/pose", 1, &FcuHoriz::handlePose, this); + ROS_INFO("fcu_horiz initialized"); + } +}; + +PLUGINLIB_EXPORT_CLASS(FcuHoriz, nodelet::Nodelet) diff --git a/clever/src/simple_offboard.py b/clever/src/simple_offboard.py index 9c4c8061..ecc909bc 100755 --- a/clever/src/simple_offboard.py +++ b/clever/src/simple_offboard.py @@ -28,26 +28,6 @@ tf_buffer = tf2_ros.Buffer() tf_listener = tf2_ros.TransformListener(tf_buffer) -def init_fcu_horiz(): - # `fcu_horiz` frame publishing - - tr = TransformStamped() - tr.header.frame_id = 'local_origin' - tr.child_frame_id = 'fcu_horiz' - - def update_pose(data): - tr.header.stamp = data.header.stamp - tr.transform.translation = vector3_from_point(data.pose.position) - yaw = euler_from_orientation(data.pose.orientation)[2] - tr.transform.rotation = orientation_from_euler(0, 0, yaw) - tf_broadcaster.sendTransform(tr) - - rospy.Subscriber('/mavros/local_position/pose', PoseStamped, update_pose) - - -init_fcu_horiz() - - position_pub = rospy.Publisher('/mavros/setpoint_raw/local', PositionTarget, queue_size=1) attitude_pub = rospy.Publisher('/mavros/setpoint_raw/attitude', AttitudeTarget, queue_size=1) target_pub = rospy.Publisher('~target', PoseStamped, queue_size=1) From 094f96b0960641ecbd67c4d0452cbb7c090f889d Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Tue, 19 Dec 2017 03:57:50 +0300 Subject: [PATCH 093/149] =?UTF-8?q?Fix=20aruco=20board=20=C2=ABreference?= =?UTF-8?q?=20point=C2=BB=20determination?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aruco_pose/src/aruco_pose.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aruco_pose/src/aruco_pose.cpp b/aruco_pose/src/aruco_pose.cpp index 7723dd35..11fad954 100644 --- a/aruco_pose/src/aruco_pose.cpp +++ b/aruco_pose/src/aruco_pose.cpp @@ -157,8 +157,8 @@ cv::Point3f ArucoPose::getObjPointsCenter(cv::Mat objPoints) { for (int i = 0; i < objPoints.rows; i++) { max_x = std::max(max_x, objPoints.at(i, 0)); max_y = std::max(max_y, objPoints.at(i, 1)); - min_x = std::min(max_x, objPoints.at(i, 0)); - min_y = std::min(max_y, objPoints.at(i, 1)); + min_x = std::min(min_x, objPoints.at(i, 0)); + min_y = std::min(min_y, objPoints.at(i, 1)); } cv::Point3f res((min_x + max_x) / 2, (min_y + max_y) / 2, 0); return res; From 947ed4f9c3acf4bbfbe04b1a5e340cb7f2208032 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Tue, 19 Dec 2017 15:42:50 +0300 Subject: [PATCH 094/149] Update sitl.launch --- clever/launch/sitl.launch | 1 - 1 file changed, 1 deletion(-) diff --git a/clever/launch/sitl.launch b/clever/launch/sitl.launch index 94c0698b..5cc8a0ca 100644 --- a/clever/launch/sitl.launch +++ b/clever/launch/sitl.launch @@ -13,6 +13,5 @@ - From b89574c6c562390bf8bbd6b8cc0639db36cb701c Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Tue, 19 Dec 2017 20:13:28 +0300 Subject: [PATCH 095/149] Fix yaw value in rewritten fcu_horiz --- clever/src/fcu_horiz.cpp | 9 +++++++++ clever/src/util.h | 17 +++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 clever/src/util.h diff --git a/clever/src/fcu_horiz.cpp b/clever/src/fcu_horiz.cpp index 4dd4adc0..aa17c1e3 100644 --- a/clever/src/fcu_horiz.cpp +++ b/clever/src/fcu_horiz.cpp @@ -4,6 +4,8 @@ #include #include +#include "util.h" + class FcuHoriz : public nodelet::Nodelet { geometry_msgs::TransformStamped t_; @@ -11,11 +13,18 @@ class FcuHoriz : public nodelet::Nodelet void handlePose(const geometry_msgs::PoseStampedConstPtr& msg) { static tf2_ros::TransformBroadcaster br; + double roll, pitch, yaw; + t_.header.stamp = msg->header.stamp; t_.header.frame_id = msg->header.frame_id; t_.transform.translation.x = msg->pose.position.x; t_.transform.translation.y = msg->pose.position.y; t_.transform.translation.z = msg->pose.position.z; + + // Warning: this is not thead-safe + quaternionToEuler(msg->pose.orientation, roll, pitch, yaw); + eulerToQuaternion(t_.transform.rotation, 0, 0, yaw); + br.sendTransform(t_); } diff --git a/clever/src/util.h b/clever/src/util.h new file mode 100644 index 00000000..0eb7f1e9 --- /dev/null +++ b/clever/src/util.h @@ -0,0 +1,17 @@ +#pragma once + +#include +#include + +inline void quaternionToEuler(geometry_msgs::Quaternion q, double& roll, double& pitch, double& yaw) +{ + tf::Quaternion tfq(q.x, q.y, q.z, q.w); + tf::Matrix3x3 m(tfq); + m.getRPY(roll, pitch, yaw); +} + +inline void eulerToQuaternion(geometry_msgs::Quaternion& q, double roll, double pitch, double yaw) +{ + tf::Quaternion tfq(roll, pitch, yaw); + quaternionTFToMsg(tfq, q); +} From 4d8810a66795228b44863cd4c1e6ddba50d2ef53 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Wed, 20 Dec 2017 22:19:16 +0300 Subject: [PATCH 096/149] Transfer nodelet_manager to clever.launch --- clever/launch/bottom_camera.launch | 4 ---- clever/launch/clever.launch | 6 ++++++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/clever/launch/bottom_camera.launch b/clever/launch/bottom_camera.launch index 5662c4f0..87ecb77a 100644 --- a/clever/launch/bottom_camera.launch +++ b/clever/launch/bottom_camera.launch @@ -1,8 +1,4 @@ - - - - diff --git a/clever/launch/clever.launch b/clever/launch/clever.launch index e53cb5b5..3fc09faf 100644 --- a/clever/launch/clever.launch +++ b/clever/launch/clever.launch @@ -26,8 +26,14 @@ + + + + + + From 5d358c54149336c3baaf34a3e93a9d01dc52190a Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 21 Dec 2017 03:24:54 +0300 Subject: [PATCH 097/149] +comment --- clever/launch/clever.launch | 1 + 1 file changed, 1 insertion(+) diff --git a/clever/launch/clever.launch b/clever/launch/clever.launch index 3fc09faf..ec3e44ab 100644 --- a/clever/launch/clever.launch +++ b/clever/launch/clever.launch @@ -29,6 +29,7 @@ + From 4cab4e752639ebbe081f970e490b5e9b84720ef5 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 21 Dec 2017 06:22:28 +0300 Subject: [PATCH 098/149] Add C++ version of aruco_vpe --- clever/src/aruco_vpe.cpp | 112 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 clever/src/aruco_vpe.cpp diff --git a/clever/src/aruco_vpe.cpp b/clever/src/aruco_vpe.cpp new file mode 100644 index 00000000..e737970b --- /dev/null +++ b/clever/src/aruco_vpe.cpp @@ -0,0 +1,112 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "util.h" + +using namespace tf2_ros; +using geometry_msgs::PoseStamped; +using geometry_msgs::TransformStamped; + +class ArucoVPE : public nodelet::Nodelet +{ +public: + ArucoVPE() : + last_published_(0), + lookup_timeout_(0.05) + {} + +private: + ros::Time last_published_; + ros::Duration lookup_timeout_; + ros::Publisher vision_position_pub_; + ros::Timer dummy_vision_timer_; + + void onInit() + { + ros::NodeHandle& nh = getNodeHandle(); + static ros::Subscriber pose_sub = nh.subscribe("aruco_pose/pose", 1, &ArucoVPE::handleArucoPose, this); + vision_position_pub_ = nh.advertise("mavros/vision_pose/pose", 1); + + dummy_vision_timer_ = nh.createTimer(ros::Duration(0.5), &ArucoVPE::publishDummy, this); + + ROS_INFO("Aruco VPE initialized"); + } + + void publishDummy(const ros::TimerEvent&) + { + // This is published to init FCU's position estimator + static PoseStamped ps; + ps.header.stamp = ros::Time::now(); + ps.pose.orientation.w = 1; + vision_position_pub_.publish(ps); + } + + void handleArucoPose(const geometry_msgs::PoseStampedConstPtr& pose) + { + static TransformBroadcaster br; + static Buffer tf_buffer; + static TransformListener tfListener(tf_buffer); + static StaticTransformBroadcaster static_br; + static PoseStamped ps, vpe_raw, vpe; + TransformStamped t; + + ros::Time stamp = pose->header.stamp; + double roll, pitch, yaw; + + try + { + // Refine aruco map pose + // Reference in local origin + t = tf_buffer.lookupTransform("local_origin", "aruco_map_reference", stamp, lookup_timeout_); + quaternionToEuler(t.transform.rotation, roll, pitch, yaw); + eulerToQuaternion(t.transform.rotation, 0, 0, yaw); + t.child_frame_id = "aruco_map_reference_horiz"; + br.sendTransform(t); + + // Aruco map in reference + t = tf_buffer.lookupTransform("aruco_map_reference", "aruco_map_raw", stamp, lookup_timeout_); + t.header.frame_id = "aruco_map_reference_horiz"; + t.child_frame_id = "aruco_map_vision"; + br.sendTransform(t); + + // Reset VPE + if (!last_published_.isValid() or ros::Time::now() - last_published_ > ros::Duration(2)) + { + ROS_INFO("Reset VPE"); + t = tf_buffer.lookupTransform("local_origin", "aruco_map_vision", stamp, lookup_timeout_); + t.child_frame_id = "aruco_map"; + static_br.sendTransform(t); + } + + // Calculate VPE + ps.header.frame_id = "fcu_horiz"; + ps.header.stamp = stamp; + ps.pose.orientation.w = 1; + + tf_buffer.transform(ps, vpe_raw, "aruco_map_vision", lookup_timeout_); + + vpe_raw.header.frame_id = "aruco_map"; + tf_buffer.transform(vpe_raw, vpe, "local_origin", lookup_timeout_); + + vision_position_pub_.publish(vpe); + + last_published_ = stamp; + dummy_vision_timer_.stop(); + } + catch (const tf2::TransformException& e) + { + ROS_WARN_THROTTLE(10, "Aruco VPE: failed to transform: %s", e.what()); + } + } +}; + +PLUGINLIB_EXPORT_CLASS(ArucoVPE, nodelet::Nodelet) From 1ff46dc6b0232e6b6184336b6ee14935a9ea263f Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 21 Dec 2017 23:44:35 +0300 Subject: [PATCH 099/149] local_origin_upside_down frame (for ceiling markers orientation) --- clever/launch/clever.launch | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clever/launch/clever.launch b/clever/launch/clever.launch index ec3e44ab..35099f72 100644 --- a/clever/launch/clever.launch +++ b/clever/launch/clever.launch @@ -34,6 +34,8 @@ + + From 7be12fcbe4a1560ef34b2ea1ffe66f8aaf97fb14 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 21 Dec 2017 23:46:20 +0300 Subject: [PATCH 100/149] Use C++ version of aruco_vpe --- clever/CMakeLists.txt | 11 ++++ clever/launch/aruco.launch | 5 +- clever/nodelet_plugins.xml | 5 ++ clever/src/aruco_vpe.cpp | 9 +++- clever/src/aruco_vpe.py | 106 ------------------------------------- 5 files changed, 28 insertions(+), 108 deletions(-) delete mode 100755 clever/src/aruco_vpe.py diff --git a/clever/CMakeLists.txt b/clever/CMakeLists.txt index 523d79ca..a32e4da9 100644 --- a/clever/CMakeLists.txt +++ b/clever/CMakeLists.txt @@ -17,6 +17,9 @@ find_package(catkin REQUIRED COMPONENTS geometry_msgs sensor_msgs geographic_msgs + tf + tf2 + tf2_geometry_msgs ) @@ -142,6 +145,10 @@ add_library(fcu_horiz src/fcu_horiz.cpp ) +add_library(aruco_vpe + src/aruco_vpe.cpp +) + ## Add cmake target dependencies of the library ## as an example, code may need to be generated before libraries ## either from message generation or dynamic reconfigure @@ -168,6 +175,10 @@ target_link_libraries(fcu_horiz "/opt/ros/kinetic/lib/libtf2_ros.so" ) +target_link_libraries(aruco_vpe + ${catkin_LIBRARIES} +) + ############# ## Install ## ############# diff --git a/clever/launch/aruco.launch b/clever/launch/aruco.launch index b29a81af..ea7e450b 100644 --- a/clever/launch/aruco.launch +++ b/clever/launch/aruco.launch @@ -15,5 +15,8 @@ - + + + + diff --git a/clever/nodelet_plugins.xml b/clever/nodelet_plugins.xml index 86ef931a..9e1c2c67 100644 --- a/clever/nodelet_plugins.xml +++ b/clever/nodelet_plugins.xml @@ -3,3 +3,8 @@ + + + + + diff --git a/clever/src/aruco_vpe.cpp b/clever/src/aruco_vpe.cpp index e737970b..547be33b 100644 --- a/clever/src/aruco_vpe.cpp +++ b/clever/src/aruco_vpe.cpp @@ -15,6 +15,7 @@ using namespace tf2_ros; using geometry_msgs::PoseStamped; using geometry_msgs::TransformStamped; +using std::string; class ArucoVPE : public nodelet::Nodelet { @@ -29,12 +30,18 @@ private: ros::Duration lookup_timeout_; ros::Publisher vision_position_pub_; ros::Timer dummy_vision_timer_; + string aruco_orientation_; void onInit() { ros::NodeHandle& nh = getNodeHandle(); + ros::NodeHandle& nh_priv = getPrivateNodeHandle(); + static ros::Subscriber pose_sub = nh.subscribe("aruco_pose/pose", 1, &ArucoVPE::handleArucoPose, this); vision_position_pub_ = nh.advertise("mavros/vision_pose/pose", 1); + nh_priv.param("aruco_orientation", aruco_orientation_, "local_origin"); + + ROS_INFO("aruco orientation frame: %s", aruco_orientation_.c_str()); dummy_vision_timer_ = nh.createTimer(ros::Duration(0.5), &ArucoVPE::publishDummy, this); @@ -66,7 +73,7 @@ private: { // Refine aruco map pose // Reference in local origin - t = tf_buffer.lookupTransform("local_origin", "aruco_map_reference", stamp, lookup_timeout_); + t = tf_buffer.lookupTransform(aruco_orientation_, "aruco_map_reference", stamp, lookup_timeout_); quaternionToEuler(t.transform.rotation, roll, pitch, yaw); eulerToQuaternion(t.transform.rotation, 0, 0, yaw); t.child_frame_id = "aruco_map_reference_horiz"; diff --git a/clever/src/aruco_vpe.py b/clever/src/aruco_vpe.py deleted file mode 100755 index aaadbd6a..00000000 --- a/clever/src/aruco_vpe.py +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/env python - -import rospy -from geometry_msgs.msg import PoseStamped, PointStamped, Quaternion -import tf2_ros -from tf2_geometry_msgs import do_transform_pose -import tf.transformations - -from util import orientation_from_euler, euler_from_orientation - - -rospy.init_node('aruco_vpe') - - -LOOKUP_TIMEOUT = rospy.Duration(.05) -CAMERA_FRAME_ID = rospy.get_param('~camera_frame_id', 'bottom_camera_optical') - - -# TF2 stuff -tf_broadcaster = tf2_ros.TransformBroadcaster() -static_tf_broadcaster = tf2_ros.StaticTransformBroadcaster() - -tf_buffer = tf2_ros.Buffer() -tf_listener = tf2_ros.TransformListener(tf_buffer) - - -vision_position_pub = rospy.Publisher('mavros/vision_pose/pose', PoseStamped, queue_size=1) -_vision_position_pub = rospy.Publisher('fake_vision_pose', PoseStamped, queue_size=1) -last_published = None - - -q = Quaternion() -q.w = 1 -ps = PoseStamped() -ps.pose.orientation = q - - -def send_transform(transform, child_frame_id): - transform.child_frame_id = child_frame_id - tf_broadcaster.sendTransform(transform) - - -vpe_posted = False - - -def publish_vpe(pose): - stamp = pose.header.stamp - - global last_published, vpe_posted - vpe_posted = True - - def lookup_transform(target_frame, source_frame): - return tf_buffer.lookup_transform(target_frame, source_frame, stamp, LOOKUP_TIMEOUT) - - # Refine aruco_map - reference_in_local_origin = lookup_transform('local_origin', 'aruco_map_reference') - roll, pitch, yaw = euler_from_orientation(reference_in_local_origin.transform.rotation) - reference_in_local_origin.transform.rotation = orientation_from_euler(0, 0, yaw) - send_transform(reference_in_local_origin, 'aruco_map_reference_horiz') - - aruco_map_in_reference = lookup_transform('aruco_map_reference', 'aruco_map_raw') - aruco_map_in_reference.header.frame_id = 'aruco_map_reference_horiz' - send_transform(aruco_map_in_reference, 'aruco_map_vision') - - # Reset VPE - if last_published is None or stamp - last_published > rospy.Duration(2): - rospy.loginfo('Reset VPE') - aruco_map_in_local_origin = lookup_transform('local_origin', 'aruco_map_vision') - aruco_map_in_local_origin.child_frame_id = 'aruco_map' - static_tf_broadcaster.sendTransform(aruco_map_in_local_origin) - - # Calculate VPE - ps.header.frame_id = 'fcu_horiz' - ps.header.stamp = stamp - vpe_raw = tf_buffer.transform(ps, 'aruco_map_vision', LOOKUP_TIMEOUT) - vpe_raw.header.frame_id = 'aruco_map' - vpe = tf_buffer.transform(vpe_raw, 'local_origin', LOOKUP_TIMEOUT) - _vision_position_pub.publish(vpe_raw) - vision_position_pub.publish(vpe) - last_published = stamp - - -rospy.Subscriber('aruco_pose/pose', PoseStamped, publish_vpe, queue_size=1) - - -local_pose = None - - -def handle_pose(data): - global local_pose - local_pose = data - - -rospy.Subscriber('mavros/local_position/pose', PoseStamped, handle_pose, queue_size=1) - - -rospy.loginfo('aruco_vpe inited') -r = rospy.Rate(5) - - -while not rospy.is_shutdown(): - if not vpe_posted: - ps.header.stamp = rospy.get_rostime() - vision_position_pub.publish(ps) - - r.sleep() From deaba007cd450c1df93fe3f32879c59635e794fc Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Fri, 22 Dec 2017 02:56:04 +0300 Subject: [PATCH 101/149] `aruco_orientation`, `use_mocap` params for aruco_vpe --- clever/src/aruco_vpe.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/clever/src/aruco_vpe.cpp b/clever/src/aruco_vpe.cpp index 547be33b..acd66add 100644 --- a/clever/src/aruco_vpe.cpp +++ b/clever/src/aruco_vpe.cpp @@ -37,9 +37,13 @@ private: ros::NodeHandle& nh = getNodeHandle(); ros::NodeHandle& nh_priv = getPrivateNodeHandle(); + nh_priv.param("aruco_orientation", aruco_orientation_, "local_origin"); + bool use_mocap; + nh_priv.param("use_mocap", use_mocap, false); + static ros::Subscriber pose_sub = nh.subscribe("aruco_pose/pose", 1, &ArucoVPE::handleArucoPose, this); - vision_position_pub_ = nh.advertise("mavros/vision_pose/pose", 1); - nh_priv.param("aruco_orientation", aruco_orientation_, "local_origin"); + + vision_position_pub_ = nh.advertise(use_mocap ? "mavros/mocap/pose" : "mavros/vision_pose/pose", 1); ROS_INFO("aruco orientation frame: %s", aruco_orientation_.c_str()); From a7cdfb4a0fdc1f230c1cdce745a19a03c0e10b1b Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Fri, 22 Dec 2017 18:09:57 +0300 Subject: [PATCH 102/149] Fix pitch and roll in get_telemetry --- clever/src/simple_offboard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clever/src/simple_offboard.py b/clever/src/simple_offboard.py index ecc909bc..d4ff37f9 100755 --- a/clever/src/simple_offboard.py +++ b/clever/src/simple_offboard.py @@ -387,7 +387,7 @@ def get_telemetry(req): _, _, res['yaw'] = euler_from_orientation(p.pose.orientation) # Calculate pitch and roll as angles between the pose and fcu_horiz attitude_pose = tf_buffer.transform(pose, 'fcu_horiz', TRANSFORM_TIMEOUT) - res['pitch'], res['roll'], _ = euler_from_orientation(attitude_pose.pose.orientation) + res['roll'], res['pitch'], _ = euler_from_orientation(attitude_pose.pose.orientation) if velocity: v = Vector3Stamped() From fca6bc1fc042b18c27bab30dc5e3f18c3b0e1618 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Sun, 24 Dec 2017 01:51:49 +0300 Subject: [PATCH 103/149] Little comment change --- clever/launch/clever.launch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clever/launch/clever.launch b/clever/launch/clever.launch index 35099f72..abbee064 100644 --- a/clever/launch/clever.launch +++ b/clever/launch/clever.launch @@ -29,7 +29,7 @@ - + From e6e5e1a29979021cc7517d4e02d191c8dcc4f704 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 28 Dec 2017 03:52:55 +0300 Subject: [PATCH 104/149] Decrease ~setpoint_rate default --- clever/src/simple_offboard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clever/src/simple_offboard.py b/clever/src/simple_offboard.py index d4ff37f9..63c0fc63 100755 --- a/clever/src/simple_offboard.py +++ b/clever/src/simple_offboard.py @@ -80,7 +80,7 @@ AUTO_ARM = AUTO_OFFBOARD and rospy.get_param('~auto_arm', True) OFFBOARD_TIMEOUT = rospy.Duration(rospy.get_param('~offboard_timeout', 3)) ARM_TIMEOUT = rospy.Duration(rospy.get_param('~arm_timeout', 5)) TRANSFORM_TIMEOUT = rospy.Duration(rospy.get_param('~transform_timeout', 3)) -SETPOINT_RATE = rospy.get_param('~setpoint_rate', 50) +SETPOINT_RATE = rospy.get_param('~setpoint_rate', 30) def offboard_and_arm(): From daddb30698b03eebec9672222f2feba76a6831f7 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 28 Dec 2017 03:53:17 +0300 Subject: [PATCH 105/149] simple_offboard: error on lack of mavros/state --- clever/src/simple_offboard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clever/src/simple_offboard.py b/clever/src/simple_offboard.py index 63c0fc63..749c146a 100755 --- a/clever/src/simple_offboard.py +++ b/clever/src/simple_offboard.py @@ -307,7 +307,7 @@ handle_lock = Lock() def handle(req): global current_pub, current_msg, current_req - if not state.connected: + if not state or not state.connected: return {'message': 'No connection to the FCU'} if isinstance(req, srv.NavigateRequest) and req.speed <= 0: From 6769e8b86f0418a10666e84faabbb7d59ef71d3d Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 28 Dec 2017 03:53:38 +0300 Subject: [PATCH 106/149] simple_offboard: error if copter is not armed/offboarded and auto_arm=False --- clever/src/simple_offboard.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/clever/src/simple_offboard.py b/clever/src/simple_offboard.py index 749c146a..4ec0727f 100755 --- a/clever/src/simple_offboard.py +++ b/clever/src/simple_offboard.py @@ -326,6 +326,11 @@ def handle(req): if req.auto_arm: offboard_and_arm() + else: + if state.mode != 'OFFBOARD': + return {'message': 'Copter is not in OFFBOARD mode, use auto_arm?'} + if not state.armed: + return {'message': 'Copter is not armed, use auto_arm?'} return {'success': True} From ecddf122bffb42b5e542cf78d24e412e6eba3a6b Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 28 Dec 2017 04:01:52 +0300 Subject: [PATCH 107/149] Stop publishing zero vision positions when local position is obtained --- clever/src/aruco_vpe.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/clever/src/aruco_vpe.cpp b/clever/src/aruco_vpe.cpp index acd66add..890a9822 100644 --- a/clever/src/aruco_vpe.cpp +++ b/clever/src/aruco_vpe.cpp @@ -41,7 +41,8 @@ private: bool use_mocap; nh_priv.param("use_mocap", use_mocap, false); - static ros::Subscriber pose_sub = nh.subscribe("aruco_pose/pose", 1, &ArucoVPE::handleArucoPose, this); + static ros::Subscriber pose_sub = nh.subscribe("mavros/local_position/pose", 1, &ArucoVPE::handlePose, this); + static ros::Subscriber aruco_pose_sub = nh.subscribe("aruco_pose/pose", 1, &ArucoVPE::handleArucoPose, this); vision_position_pub_ = nh.advertise(use_mocap ? "mavros/mocap/pose" : "mavros/vision_pose/pose", 1); @@ -61,6 +62,13 @@ private: vision_position_pub_.publish(ps); } + void handlePose(const geometry_msgs::PoseStampedConstPtr& pose) + { + // local position is inited, stop posting dummy position + ROS_INFO_ONCE("Got local position, stop publishing zeroes"); + dummy_vision_timer_.stop(); + } + void handleArucoPose(const geometry_msgs::PoseStampedConstPtr& pose) { static TransformBroadcaster br; From 69f8b6e5456876d20d3e6f1e9c7a21318d7ae4f2 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 28 Dec 2017 04:02:19 +0300 Subject: [PATCH 108/149] ~reset_vpe option to reset VPE only once (enabled by default if MOCAP package is used) --- clever/src/aruco_vpe.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/clever/src/aruco_vpe.cpp b/clever/src/aruco_vpe.cpp index 890a9822..122297c1 100644 --- a/clever/src/aruco_vpe.cpp +++ b/clever/src/aruco_vpe.cpp @@ -31,6 +31,7 @@ private: ros::Publisher vision_position_pub_; ros::Timer dummy_vision_timer_; string aruco_orientation_; + bool reset_vpe_; void onInit() { @@ -40,6 +41,7 @@ private: nh_priv.param("aruco_orientation", aruco_orientation_, "local_origin"); bool use_mocap; nh_priv.param("use_mocap", use_mocap, false); + nh_priv.param("reset_vpe", reset_vpe_, !use_mocap); static ros::Subscriber pose_sub = nh.subscribe("mavros/local_position/pose", 1, &ArucoVPE::handlePose, this); static ros::Subscriber aruco_pose_sub = nh.subscribe("aruco_pose/pose", 1, &ArucoVPE::handleArucoPose, this); @@ -97,8 +99,8 @@ private: t.child_frame_id = "aruco_map_vision"; br.sendTransform(t); - // Reset VPE - if (!last_published_.isValid() or ros::Time::now() - last_published_ > ros::Duration(2)) + if (last_published_.toSec() == 0 || // no vpe has been posted + (reset_vpe_ && (ros::Time::now() - last_published_ > ros::Duration(2)))) // vpe origin outdated { ROS_INFO("Reset VPE"); t = tf_buffer.lookupTransform("local_origin", "aruco_map_vision", stamp, lookup_timeout_); From afa044e457fa8c8b311ee51745c7e6423411c316 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 28 Dec 2017 04:04:35 +0300 Subject: [PATCH 109/149] Run mavros_node explicitly instead of using px4.launch --- clever/launch/mavros.launch | 74 ++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 34 deletions(-) diff --git a/clever/launch/mavros.launch b/clever/launch/mavros.launch index c3091bcf..ae2a1c8c 100644 --- a/clever/launch/mavros.launch +++ b/clever/launch/mavros.launch @@ -4,44 +4,50 @@ - - - + + + - - + + - - + + - - - + + + + + + + + + + + + + + + + - safety_area + - image_pub + - vibration + - distance_sensor + - rangefinder + - 3dr_radio + - actuator_control + - hil_controls + - manual_control + - vfr_hud + - px4flow + - vision_speed_estimate + - fake_gps + - cam_imu_sync + - hil + - adsb + + - - - - - - - - - safety_area - - image_pub - - vibration - - distance_sensor - - rangefinder - - 3dr_radio - - actuator_control - - hil_controls - - manual_control - - vfr_hud - - px4flow - - vision_speed_estimate - - fake_gps - - cam_imu_sync - - hil - - adsb - From 0030eb54446e796629b1eb7dc9146cbab091f2e9 Mon Sep 17 00:00:00 2001 From: Arthur Golubtsov Date: Thu, 28 Dec 2017 11:27:33 +0300 Subject: [PATCH 110/149] update clever-rc version --- clever/static | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clever/static b/clever/static index 0ec80bbc..54c53043 160000 --- a/clever/static +++ b/clever/static @@ -1 +1 @@ -Subproject commit 0ec80bbccf1d1617118ec4a8b7c7fe9ca5abe5b3 +Subproject commit 54c530431f1060cf21ceeb8f38a0ab914e570d8b From 53dafed67977765968309f487a1eac7f6e95da5b Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 28 Dec 2017 23:47:45 +0300 Subject: [PATCH 111/149] Show exception if creating aruco board fails --- aruco_pose/src/aruco_pose.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/aruco_pose/src/aruco_pose.cpp b/aruco_pose/src/aruco_pose.cpp index 11fad954..5f40f98a 100644 --- a/aruco_pose/src/aruco_pose.cpp +++ b/aruco_pose/src/aruco_pose.cpp @@ -47,7 +47,16 @@ void ArucoPose::onInit() { dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_4X4_1000); parameters = cv::aruco::DetectorParameters::create(); - createBoard(); + + try + { + createBoard(); + } + catch (const std::exception &exc) + { + std::cerr << exc.what(); + exit(0); + } image_transport::ImageTransport it(nh_); img_sub = it.subscribeCamera("image", 1, &ArucoPose::detect, this); From 4fd9f15ebae8fb43a4cd273cf4ea4b6bbe17d98e Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 28 Dec 2017 23:49:17 +0300 Subject: [PATCH 112/149] ~markers_sep_x, ~markers_sep_y parameters for grid boards + various fixes --- aruco_pose/src/aruco_pose.cpp | 54 ++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 13 deletions(-) diff --git a/aruco_pose/src/aruco_pose.cpp b/aruco_pose/src/aruco_pose.cpp index 5f40f98a..d6f4853f 100644 --- a/aruco_pose/src/aruco_pose.cpp +++ b/aruco_pose/src/aruco_pose.cpp @@ -69,10 +69,10 @@ void ArucoPose::onInit() { ROS_INFO("aruco_pose nodelet inited"); } -cv::Ptr createCustomBoard(int markersX, int markersY, float markerLength, float markerSeparation, +cv::Ptr createCustomGridBoard(int markersX, int markersY, float markerLength, float markerSeparationX, float markerSeparationY, const cv::Ptr &dictionary, std::vector ids) { - CV_Assert(markersX > 0 && markersY > 0 && markerLength > 0 && markerSeparation > 0); + CV_Assert(markersX > 0 && markersY > 0 && markerLength > 0 && markerSeparationX > 0 && markerSeparationY > 0); cv::Ptr res = cv::makePtr(); @@ -83,13 +83,13 @@ cv::Ptr createCustomBoard(int markersX, int markersY, float ma res->objPoints.reserve(totalMarkers); // calculate Board objPoints - float maxY = (float)markersY * markerLength + (markersY - 1) * markerSeparation; + float maxY = (float)markersY * markerLength + (markersY - 1) * markerSeparationY; for(int y = 0; y < markersY; y++) { for(int x = 0; x < markersX; x++) { std::vector< cv::Point3f > corners; corners.resize(4); - corners[0] = cv::Point3f(x * (markerLength + markerSeparation), - maxY - y * (markerLength + markerSeparation), 0); + corners[0] = cv::Point3f(x * (markerLength + markerSeparationX), + maxY - y * (markerLength + markerSeparationY), 0); corners[1] = corners[0] + cv::Point3f(markerLength, 0, 0); corners[2] = corners[0] + cv::Point3f(markerLength, -markerLength, 0); corners[3] = corners[0] + cv::Point3f(0, -markerLength, 0); @@ -116,29 +116,57 @@ void ArucoPose::createBoard() ROS_INFO("Initialize gridboard"); int markers_x, markers_y, first_marker; - float markers_side, markers_sep; + float markers_side, markers_sep_x, markers_sep_y; std::vector marker_ids; nh_priv_.param("markers_x", markers_x, 10); nh_priv_.param("markers_y", markers_y, 10); nh_priv_.param("first_marker", first_marker, 0); if (!nh_priv_.getParam("markers_side", markers_side)) + { ROS_ERROR("gridboard: required parameter ~markers_side is not set."); + exit(1); + } - if (!nh_priv_.getParam("markers_sep", markers_sep)) - ROS_ERROR("gridboard: required parameter ~markers_sep is not set."); + if (!nh_priv_.getParam("markers_sep_x", markers_sep_x)) + { + if (!nh_priv_.getParam("markers_sep", markers_sep_x)) + { + ROS_ERROR("gridboard: ~markers_sep_x or ~markers_sep parameters are required"); + exit(1); + } + } - if (nh_priv_.getParam("marker_ids", marker_ids)) { - if (markers_x * markers_y != marker_ids.size()) { + if (!nh_priv_.getParam("markers_sep_y", markers_sep_y)) + { + if (!nh_priv_.getParam("markers_sep", markers_sep_y)) + { + ROS_ERROR("gridboard: ~markers_sep_y or ~markers_sep parameters are required"); + exit(1); + } + } + + if (nh_priv_.getParam("marker_ids", marker_ids)) + { + if (markers_x * markers_y != marker_ids.size()) + { ROS_FATAL("~marker_ids length should be equal to ~markers_x * ~markers_y"); exit(1); } - board = createCustomBoard(markers_x, markers_y, markers_side, markers_sep, dictionary, marker_ids); } - else { - board = cv::aruco::GridBoard::create(markers_x, markers_y, markers_side, markers_sep, dictionary, first_marker); + else + { + // Fill marker_ids automatically + marker_ids.resize(markers_x * markers_y); + for(int i = 0; i < markers_x * markers_y; i++) + { + marker_ids.at(i) = first_marker++; + } } + // Create grid board + board = createCustomGridBoard(markers_x, markers_y, markers_side, markers_sep_x, markers_sep_y, dictionary, marker_ids); + // Publish map image for debugging _drawPlanarBoard(board, cv::Size(2000, 2000), map_image, 50, 1); From 242e798842f9d66bf3829b848c8adcb837a81c28 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Fri, 29 Dec 2017 00:15:02 +0300 Subject: [PATCH 113/149] =?UTF-8?q?simple=5Foffboard:=20don=E2=80=99t=20fa?= =?UTF-8?q?ll=20if=20no=20cell=20voltage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- clever/src/simple_offboard.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/clever/src/simple_offboard.py b/clever/src/simple_offboard.py index 4ec0727f..e276cb22 100755 --- a/clever/src/simple_offboard.py +++ b/clever/src/simple_offboard.py @@ -416,7 +416,10 @@ def get_telemetry(req): if battery: res['voltage'] = battery.voltage - res['cell_voltage'] = battery.cell_voltage[0] + try: + res['cell_voltage'] = battery.cell_voltage[0] + except: + pass return res From ab42ea9259017a48f16cac95b321fbca5be8f345 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Tue, 9 Jan 2018 22:55:54 +0300 Subject: [PATCH 114/149] Rename bottom_camera => main_camera --- clever/launch/aruco.launch | 4 ++-- clever/launch/clever.launch | 6 +++--- .../launch/{bottom_camera.launch => main_camera.launch} | 9 +++++++-- clever/launch/sitl.launch | 2 +- 4 files changed, 13 insertions(+), 8 deletions(-) rename clever/launch/{bottom_camera.launch => main_camera.launch} (65%) diff --git a/clever/launch/aruco.launch b/clever/launch/aruco.launch index ea7e450b..158b84b5 100644 --- a/clever/launch/aruco.launch +++ b/clever/launch/aruco.launch @@ -1,6 +1,6 @@ - - + + diff --git a/clever/launch/clever.launch b/clever/launch/clever.launch index abbee064..f8a433db 100644 --- a/clever/launch/clever.launch +++ b/clever/launch/clever.launch @@ -6,7 +6,7 @@ - + @@ -42,8 +42,8 @@ - - + + diff --git a/clever/launch/bottom_camera.launch b/clever/launch/main_camera.launch similarity index 65% rename from clever/launch/bottom_camera.launch rename to clever/launch/main_camera.launch index 87ecb77a..b9f1f1e6 100644 --- a/clever/launch/bottom_camera.launch +++ b/clever/launch/main_camera.launch @@ -1,8 +1,13 @@ - - + + + + + + + diff --git a/clever/launch/sitl.launch b/clever/launch/sitl.launch index 5cc8a0ca..1e48052f 100644 --- a/clever/launch/sitl.launch +++ b/clever/launch/sitl.launch @@ -8,7 +8,7 @@ - + From adeca2174c2888b2166de2bf8f75fc11919506d5 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Tue, 9 Jan 2018 22:56:39 +0300 Subject: [PATCH 115/149] Use MOCAP package for Aruco vision --- clever/launch/aruco.launch | 1 + 1 file changed, 1 insertion(+) diff --git a/clever/launch/aruco.launch b/clever/launch/aruco.launch index 158b84b5..f4a69ada 100644 --- a/clever/launch/aruco.launch +++ b/clever/launch/aruco.launch @@ -18,5 +18,6 @@ + From a27dac53cbf389a1454f2975fabd10f6a74c025c Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Tue, 9 Jan 2018 22:57:19 +0300 Subject: [PATCH 116/149] Formatting --- clever/launch/aruco.launch | 1 + 1 file changed, 1 insertion(+) diff --git a/clever/launch/aruco.launch b/clever/launch/aruco.launch index f4a69ada..f9dc88c5 100644 --- a/clever/launch/aruco.launch +++ b/clever/launch/aruco.launch @@ -18,6 +18,7 @@ + From 4a969126422a9402cdade86ad9c81b4f81a23893 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Tue, 9 Jan 2018 22:57:30 +0300 Subject: [PATCH 117/149] Verbosity --- clever/src/simple_offboard.py | 1 + 1 file changed, 1 insertion(+) diff --git a/clever/src/simple_offboard.py b/clever/src/simple_offboard.py index e276cb22..a84b9367 100755 --- a/clever/src/simple_offboard.py +++ b/clever/src/simple_offboard.py @@ -308,6 +308,7 @@ def handle(req): global current_pub, current_msg, current_req if not state or not state.connected: + rospy.logwarn('No connection to the FCU') return {'message': 'No connection to the FCU'} if isinstance(req, srv.NavigateRequest) and req.speed <= 0: From 7826cad8587354e4aee96404bb3116de0231f96c Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Tue, 9 Jan 2018 22:58:00 +0300 Subject: [PATCH 118/149] bottom_camera => main_camera --- clever/launch/main_camera.launch | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/clever/launch/main_camera.launch b/clever/launch/main_camera.launch index b9f1f1e6..a9bc4a63 100644 --- a/clever/launch/main_camera.launch +++ b/clever/launch/main_camera.launch @@ -1,16 +1,16 @@ - - - + + - + - - + + - - + + + From c32295e88e2f5b4253549b20859aa13d75cd53ac Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Sat, 27 Jan 2018 21:03:46 +0300 Subject: [PATCH 119/149] Disable web server for a while --- clever/launch/clever.launch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clever/launch/clever.launch b/clever/launch/clever.launch index f8a433db..c89f32f1 100644 --- a/clever/launch/clever.launch +++ b/clever/launch/clever.launch @@ -3,7 +3,7 @@ - + From 07886e3afeb1842dad217a9407ab40bc0766d44c Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Tue, 30 Jan 2018 20:13:34 +0300 Subject: [PATCH 120/149] Make default camera frame clever 3 downwards --- clever/launch/main_camera.launch | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clever/launch/main_camera.launch b/clever/launch/main_camera.launch index a9bc4a63..480ba38f 100644 --- a/clever/launch/main_camera.launch +++ b/clever/launch/main_camera.launch @@ -3,10 +3,10 @@ - + - + From c5bba53d1bb6128df88a407510a75855ce266c3d Mon Sep 17 00:00:00 2001 From: urpylka Date: Mon, 5 Feb 2018 16:48:54 +0300 Subject: [PATCH 121/149] Remove empty files --- gpsmd.md | 3 --- primeri-programm.md | 0 sborka.md | 0 sitl.md | 0 4 files changed, 3 deletions(-) delete mode 100644 gpsmd.md delete mode 100644 primeri-programm.md delete mode 100644 sborka.md delete mode 100644 sitl.md diff --git a/gpsmd.md b/gpsmd.md deleted file mode 100644 index 85e8c272..00000000 --- a/gpsmd.md +++ /dev/null @@ -1,3 +0,0 @@ -Установка GPS -=== - diff --git a/primeri-programm.md b/primeri-programm.md deleted file mode 100644 index e69de29b..00000000 diff --git a/sborka.md b/sborka.md deleted file mode 100644 index e69de29b..00000000 diff --git a/sitl.md b/sitl.md deleted file mode 100644 index e69de29b..00000000 From a14c8735b15475e2d4437ed9a113f4289610a00e Mon Sep 17 00:00:00 2001 From: urpylka Date: Mon, 5 Feb 2018 17:13:56 +0300 Subject: [PATCH 122/149] Move images from 'img' to 'assets' directory --- README.md | 4 +- {img => assets}/11_1.png | Bin {img => assets}/11_2.png | Bin {img => assets}/11_3.png | Bin {img => assets}/11_4.png | Bin {img => assets}/11_5.png | Bin {img => assets}/13_1.png | Bin {img => assets}/13_10.png | Bin {img => assets}/13_11.png | Bin {img => assets}/13_2.png | Bin {img => assets}/13_3.jpg | Bin {img => assets}/13_4.png | Bin {img => assets}/13_5.png | Bin {img => assets}/13_6.png | Bin {img => assets}/13_7.png | Bin {img => assets}/13_8.png | Bin {img => assets}/13_9.png | Bin {img => assets}/15_1.png | Bin {img => assets}/15_2.png | Bin {img => assets}/15_3.png | Bin {img => assets}/15_4.png | Bin {img => assets}/15_5.png | Bin {img => assets}/15_6.png | Bin {img => assets}/15_7.png | Bin {img => assets}/16_1.png | Bin {img => assets}/16_2.png | Bin {img => assets}/16_3.png | Bin {img => assets}/16_4.png | Bin {img => assets}/1_1.png | Bin {img => assets}/1_10.png | Bin {img => assets}/1_11.png | Bin {img => assets}/1_12.png | Bin {img => assets}/1_13.png | Bin {img => assets}/1_2.png | Bin {img => assets}/1_3.png | Bin {img => assets}/1_4.png | Bin {img => assets}/1_5.png | Bin {img => assets}/1_6.png | Bin {img => assets}/1_7.png | Bin {img => assets}/1_8.png | Bin {img => assets}/1_9.png | Bin {img => assets}/2_1.png | Bin {img => assets}/2_2.png | Bin {img => assets}/2_3.png | Bin {img => assets}/2_4.png | Bin {img => assets}/2_5.png | Bin {img => assets}/2_6.png | Bin {img => assets}/2_7.png | Bin {img => assets}/2_8.png | Bin {img => assets}/2_9.png | Bin {img => assets}/4_1.png | Bin {img => assets}/4_2.png | Bin {img => assets}/4_3.png | Bin {img => assets}/4_4.png | Bin {img => assets}/4_5.png | Bin {img => assets}/4_6.png | Bin {img => assets}/7_1.png | Bin {img => assets}/7_2.png | Bin {img => assets}/7_3.png | Bin {img => assets}/7_4.png | Bin {img => assets}/8_1.png | Bin {img => assets}/8_2.png | Bin {img => assets}/8_3.png | Bin {img => assets}/8_4.png | Bin {img => assets}/8_5.png | Bin {img => assets}/8_6.png | Bin {img => assets}/9_1.png | Bin {img => assets}/9_2.png | Bin {img => assets}/Clever main.png | Bin {img => assets}/Clevermain.png | Bin {img => assets}/addEqipment.jpg | Bin {img => assets}/airframeSetup.jpg | Bin {img => assets}/allElements.png | Bin {img => assets}/attentionSave.jpg | Bin {img => assets}/brrc2205.png | Bin {img => assets}/brrc2205on.png | Bin {img => assets}/brrc2205ondeck.png | Bin {img => assets}/calibrateESC.jpg | Bin {img => assets}/calibratePIDparams.jpg | Bin {img => assets}/calibrateView.jpg | Bin {img => assets}/calibrateViewStart.jpg | Bin {img => assets}/calibrateaxcel.jpg | Bin {img => assets}/calibrateaxcelstart.jpg | Bin {img => assets}/calibratecompass.jpg | Bin {img => assets}/calibrategyro.jpg | Bin {img => assets}/casebattery.png | Bin {img => assets}/chooseSwitch.jpg | Bin {img => assets}/clever.jpg | Bin {img => assets}/connectBattery.png | Bin {img => assets}/connectingRadio.png | Bin {img => assets}/connectionESCtoReceiver.png | Bin {img => assets}/connectionLost.jpg | Bin {img => assets}/connectionOK.jpg | Bin {img => assets}/connectionPixhawk.png | Bin {img => assets}/consistofTransmitter.jpg | Bin {img => assets}/cutwire14AWG.jpg | Bin {img => assets}/escDYSzap.png | Bin {img => assets}/escWires.png | Bin {img => assets}/explosion.png | Bin {img => assets}/firmwarePX4.jpg | Bin {img => assets}/flightModes.jpg | Bin {img => assets}/helphand.jpg | Bin {img => assets}/holderLegs.png | Bin {img => assets}/isoViewmountHolder.png | Bin {img => assets}/jumper.png | Bin {img => assets}/keep.png | Bin {img => assets}/lockradio.jpg | Bin {img => assets}/lockradio.png | Bin {img => assets}/lowsafeDeck.png | Bin {img => assets}/mainWindow.jpg | Bin {img => assets}/motorsTopview.png | Bin {img => assets}/mount5vconnector.png | Bin {img => assets}/mountAntenna.png | Bin {img => assets}/mountBeams.png | Bin {img => assets}/mountBottomDeck.png | Bin {img => assets}/mountHolder.png | Bin {img => assets}/mountPDB.png | Bin {img => assets}/mountReceiverDeck.png | Bin {img => assets}/mountReceiverStud.png | Bin {img => assets}/mountxt60pinsocket.png | Bin {img => assets}/notmoveslider.jpg | Bin {img => assets}/pixhawk.png | Bin {img => assets}/radioTransmitter.png | Bin {img => assets}/readyBatteryholder.png | Bin {img => assets}/receiver5V.png | Bin {img => assets}/receiverPPM.png | Bin {img => assets}/resolderingESC.png | Bin {img => assets}/safeLegs.png | Bin {img => assets}/safehighRadial.png | Bin {img => assets}/safelowRadial.png | Bin {img => assets}/safetyINflight.png | Bin {img => assets}/safetyPower.png | Bin {img => assets}/safetyPreflight.png | Bin {img => assets}/safetybyassem.png | Bin {img => assets}/soldering5VTOpdb.png | Bin .../solderingBrrc2205ondeckTOescDYSzap.png | Bin {img => assets}/solderingPowerwires.png | Bin {img => assets}/solderingxt60socketTOpdb.png | Bin {img => assets}/stand.jpg | Bin {img => assets}/startPDBtest.jpg | Bin {img => assets}/testMotors.png | Bin {img => assets}/topESCcaseview.png | Bin {img => assets}/topPreview.png | Bin {img => assets}/topviewmountPDB.png | Bin {img => assets}/topviewpixhawk.png | Bin {img => assets}/turnoffSafetyswitch.jpg | Bin {img => assets}/xt60pinsocket.jpg | Bin {img => assets}/zap.jpg | Bin {img => assets}/zapPDBtest.jpg | Bin docs/3g.md | 2 +- docs/assemble.md | 106 +++++++++--------- docs/etcher.md | 2 +- docs/frames.md | 2 +- docs/les1.md | 26 ++--- docs/les11.md | 10 +- docs/les13.md | 22 ++-- docs/les15.md | 14 +-- docs/les16.md | 8 +- docs/les2.md | 18 +-- docs/les4.md | 12 +- docs/les7.md | 8 +- docs/les8.md | 12 +- docs/les9.md | 4 +- docs/modes.md | 2 +- docs/radioerrors.md | 8 +- docs/radioerrors1.md | 8 +- docs/safety.md | 2 +- docs/setup.md | 36 +++--- docs/simple_offboard.md | 2 +- docs/tb.md | 6 +- docs/wifi.md | 2 +- notes/deck.md | 2 +- notes/powerConnection.md | 2 +- notes/testConnection.md | 2 +- notes/zap.md | 4 +- 175 files changed, 163 insertions(+), 163 deletions(-) rename {img => assets}/11_1.png (100%) rename {img => assets}/11_2.png (100%) rename {img => assets}/11_3.png (100%) rename {img => assets}/11_4.png (100%) rename {img => assets}/11_5.png (100%) rename {img => assets}/13_1.png (100%) rename {img => assets}/13_10.png (100%) rename {img => assets}/13_11.png (100%) rename {img => assets}/13_2.png (100%) rename {img => assets}/13_3.jpg (100%) rename {img => assets}/13_4.png (100%) rename {img => assets}/13_5.png (100%) rename {img => assets}/13_6.png (100%) rename {img => assets}/13_7.png (100%) rename {img => assets}/13_8.png (100%) rename {img => assets}/13_9.png (100%) rename {img => assets}/15_1.png (100%) rename {img => assets}/15_2.png (100%) rename {img => assets}/15_3.png (100%) rename {img => assets}/15_4.png (100%) rename {img => assets}/15_5.png (100%) rename {img => assets}/15_6.png (100%) rename {img => assets}/15_7.png (100%) rename {img => assets}/16_1.png (100%) rename {img => assets}/16_2.png (100%) rename {img => assets}/16_3.png (100%) rename {img => assets}/16_4.png (100%) rename {img => assets}/1_1.png (100%) rename {img => assets}/1_10.png (100%) rename {img => assets}/1_11.png (100%) rename {img => assets}/1_12.png (100%) rename {img => assets}/1_13.png (100%) rename {img => assets}/1_2.png (100%) rename {img => assets}/1_3.png (100%) rename {img => assets}/1_4.png (100%) rename {img => assets}/1_5.png (100%) rename {img => assets}/1_6.png (100%) rename {img => assets}/1_7.png (100%) rename {img => assets}/1_8.png (100%) rename {img => assets}/1_9.png (100%) rename {img => assets}/2_1.png (100%) rename {img => assets}/2_2.png (100%) rename {img => assets}/2_3.png (100%) rename {img => assets}/2_4.png (100%) rename {img => assets}/2_5.png (100%) rename {img => assets}/2_6.png (100%) rename {img => assets}/2_7.png (100%) rename {img => assets}/2_8.png (100%) rename {img => assets}/2_9.png (100%) rename {img => assets}/4_1.png (100%) rename {img => assets}/4_2.png (100%) rename {img => assets}/4_3.png (100%) rename {img => assets}/4_4.png (100%) rename {img => assets}/4_5.png (100%) rename {img => assets}/4_6.png (100%) rename {img => assets}/7_1.png (100%) rename {img => assets}/7_2.png (100%) rename {img => assets}/7_3.png (100%) rename {img => assets}/7_4.png (100%) rename {img => assets}/8_1.png (100%) rename {img => assets}/8_2.png (100%) rename {img => assets}/8_3.png (100%) rename {img => assets}/8_4.png (100%) rename {img => assets}/8_5.png (100%) rename {img => assets}/8_6.png (100%) rename {img => assets}/9_1.png (100%) rename {img => assets}/9_2.png (100%) rename {img => assets}/Clever main.png (100%) rename {img => assets}/Clevermain.png (100%) rename {img => assets}/addEqipment.jpg (100%) rename {img => assets}/airframeSetup.jpg (100%) rename {img => assets}/allElements.png (100%) rename {img => assets}/attentionSave.jpg (100%) rename {img => assets}/brrc2205.png (100%) rename {img => assets}/brrc2205on.png (100%) rename {img => assets}/brrc2205ondeck.png (100%) rename {img => assets}/calibrateESC.jpg (100%) rename {img => assets}/calibratePIDparams.jpg (100%) rename {img => assets}/calibrateView.jpg (100%) rename {img => assets}/calibrateViewStart.jpg (100%) rename {img => assets}/calibrateaxcel.jpg (100%) rename {img => assets}/calibrateaxcelstart.jpg (100%) rename {img => assets}/calibratecompass.jpg (100%) rename {img => assets}/calibrategyro.jpg (100%) rename {img => assets}/casebattery.png (100%) rename {img => assets}/chooseSwitch.jpg (100%) rename {img => assets}/clever.jpg (100%) rename {img => assets}/connectBattery.png (100%) rename {img => assets}/connectingRadio.png (100%) rename {img => assets}/connectionESCtoReceiver.png (100%) rename {img => assets}/connectionLost.jpg (100%) rename {img => assets}/connectionOK.jpg (100%) rename {img => assets}/connectionPixhawk.png (100%) rename {img => assets}/consistofTransmitter.jpg (100%) rename {img => assets}/cutwire14AWG.jpg (100%) rename {img => assets}/escDYSzap.png (100%) rename {img => assets}/escWires.png (100%) rename {img => assets}/explosion.png (100%) rename {img => assets}/firmwarePX4.jpg (100%) rename {img => assets}/flightModes.jpg (100%) rename {img => assets}/helphand.jpg (100%) rename {img => assets}/holderLegs.png (100%) rename {img => assets}/isoViewmountHolder.png (100%) rename {img => assets}/jumper.png (100%) rename {img => assets}/keep.png (100%) rename {img => assets}/lockradio.jpg (100%) rename {img => assets}/lockradio.png (100%) rename {img => assets}/lowsafeDeck.png (100%) rename {img => assets}/mainWindow.jpg (100%) rename {img => assets}/motorsTopview.png (100%) rename {img => assets}/mount5vconnector.png (100%) rename {img => assets}/mountAntenna.png (100%) rename {img => assets}/mountBeams.png (100%) rename {img => assets}/mountBottomDeck.png (100%) rename {img => assets}/mountHolder.png (100%) rename {img => assets}/mountPDB.png (100%) rename {img => assets}/mountReceiverDeck.png (100%) rename {img => assets}/mountReceiverStud.png (100%) rename {img => assets}/mountxt60pinsocket.png (100%) rename {img => assets}/notmoveslider.jpg (100%) rename {img => assets}/pixhawk.png (100%) rename {img => assets}/radioTransmitter.png (100%) rename {img => assets}/readyBatteryholder.png (100%) rename {img => assets}/receiver5V.png (100%) rename {img => assets}/receiverPPM.png (100%) rename {img => assets}/resolderingESC.png (100%) rename {img => assets}/safeLegs.png (100%) rename {img => assets}/safehighRadial.png (100%) rename {img => assets}/safelowRadial.png (100%) rename {img => assets}/safetyINflight.png (100%) rename {img => assets}/safetyPower.png (100%) rename {img => assets}/safetyPreflight.png (100%) rename {img => assets}/safetybyassem.png (100%) rename {img => assets}/soldering5VTOpdb.png (100%) rename {img => assets}/solderingBrrc2205ondeckTOescDYSzap.png (100%) rename {img => assets}/solderingPowerwires.png (100%) rename {img => assets}/solderingxt60socketTOpdb.png (100%) rename {img => assets}/stand.jpg (100%) rename {img => assets}/startPDBtest.jpg (100%) rename {img => assets}/testMotors.png (100%) rename {img => assets}/topESCcaseview.png (100%) rename {img => assets}/topPreview.png (100%) rename {img => assets}/topviewmountPDB.png (100%) rename {img => assets}/topviewpixhawk.png (100%) rename {img => assets}/turnoffSafetyswitch.jpg (100%) rename {img => assets}/xt60pinsocket.jpg (100%) rename {img => assets}/zap.jpg (100%) rename {img => assets}/zapPDBtest.jpg (100%) diff --git a/README.md b/README.md index 23f94ae7..32784f3b 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ Клевер ====== -Клевер +Клевер «Клевер» — это учебный конструктор программируемого квадрокоптера, состоящего из популярных открытых компонентов, а также набор необходимой документации и библиотек для работы с ним. @@ -11,4 +11,4 @@ Для того, чтобы научиться собирать, настраивать, пилотировать и программировать автономный дрон «Клевер», воспользуйтесь этим учебником. -Оглавление находится в файле [SUMMARY.md](/SUMMARY.md). \ No newline at end of file +Оглавление находится в файле [SUMMARY.md](/SUMMARY.md). diff --git a/img/11_1.png b/assets/11_1.png similarity index 100% rename from img/11_1.png rename to assets/11_1.png diff --git a/img/11_2.png b/assets/11_2.png similarity index 100% rename from img/11_2.png rename to assets/11_2.png diff --git a/img/11_3.png b/assets/11_3.png similarity index 100% rename from img/11_3.png rename to assets/11_3.png diff --git a/img/11_4.png b/assets/11_4.png similarity index 100% rename from img/11_4.png rename to assets/11_4.png diff --git a/img/11_5.png b/assets/11_5.png similarity index 100% rename from img/11_5.png rename to assets/11_5.png diff --git a/img/13_1.png b/assets/13_1.png similarity index 100% rename from img/13_1.png rename to assets/13_1.png diff --git a/img/13_10.png b/assets/13_10.png similarity index 100% rename from img/13_10.png rename to assets/13_10.png diff --git a/img/13_11.png b/assets/13_11.png similarity index 100% rename from img/13_11.png rename to assets/13_11.png diff --git a/img/13_2.png b/assets/13_2.png similarity index 100% rename from img/13_2.png rename to assets/13_2.png diff --git a/img/13_3.jpg b/assets/13_3.jpg similarity index 100% rename from img/13_3.jpg rename to assets/13_3.jpg diff --git a/img/13_4.png b/assets/13_4.png similarity index 100% rename from img/13_4.png rename to assets/13_4.png diff --git a/img/13_5.png b/assets/13_5.png similarity index 100% rename from img/13_5.png rename to assets/13_5.png diff --git a/img/13_6.png b/assets/13_6.png similarity index 100% rename from img/13_6.png rename to assets/13_6.png diff --git a/img/13_7.png b/assets/13_7.png similarity index 100% rename from img/13_7.png rename to assets/13_7.png diff --git a/img/13_8.png b/assets/13_8.png similarity index 100% rename from img/13_8.png rename to assets/13_8.png diff --git a/img/13_9.png b/assets/13_9.png similarity index 100% rename from img/13_9.png rename to assets/13_9.png diff --git a/img/15_1.png b/assets/15_1.png similarity index 100% rename from img/15_1.png rename to assets/15_1.png diff --git a/img/15_2.png b/assets/15_2.png similarity index 100% rename from img/15_2.png rename to assets/15_2.png diff --git a/img/15_3.png b/assets/15_3.png similarity index 100% rename from img/15_3.png rename to assets/15_3.png diff --git a/img/15_4.png b/assets/15_4.png similarity index 100% rename from img/15_4.png rename to assets/15_4.png diff --git a/img/15_5.png b/assets/15_5.png similarity index 100% rename from img/15_5.png rename to assets/15_5.png diff --git a/img/15_6.png b/assets/15_6.png similarity index 100% rename from img/15_6.png rename to assets/15_6.png diff --git a/img/15_7.png b/assets/15_7.png similarity index 100% rename from img/15_7.png rename to assets/15_7.png diff --git a/img/16_1.png b/assets/16_1.png similarity index 100% rename from img/16_1.png rename to assets/16_1.png diff --git a/img/16_2.png b/assets/16_2.png similarity index 100% rename from img/16_2.png rename to assets/16_2.png diff --git a/img/16_3.png b/assets/16_3.png similarity index 100% rename from img/16_3.png rename to assets/16_3.png diff --git a/img/16_4.png b/assets/16_4.png similarity index 100% rename from img/16_4.png rename to assets/16_4.png diff --git a/img/1_1.png b/assets/1_1.png similarity index 100% rename from img/1_1.png rename to assets/1_1.png diff --git a/img/1_10.png b/assets/1_10.png similarity index 100% rename from img/1_10.png rename to assets/1_10.png diff --git a/img/1_11.png b/assets/1_11.png similarity index 100% rename from img/1_11.png rename to assets/1_11.png diff --git a/img/1_12.png b/assets/1_12.png similarity index 100% rename from img/1_12.png rename to assets/1_12.png diff --git a/img/1_13.png b/assets/1_13.png similarity index 100% rename from img/1_13.png rename to assets/1_13.png diff --git a/img/1_2.png b/assets/1_2.png similarity index 100% rename from img/1_2.png rename to assets/1_2.png diff --git a/img/1_3.png b/assets/1_3.png similarity index 100% rename from img/1_3.png rename to assets/1_3.png diff --git a/img/1_4.png b/assets/1_4.png similarity index 100% rename from img/1_4.png rename to assets/1_4.png diff --git a/img/1_5.png b/assets/1_5.png similarity index 100% rename from img/1_5.png rename to assets/1_5.png diff --git a/img/1_6.png b/assets/1_6.png similarity index 100% rename from img/1_6.png rename to assets/1_6.png diff --git a/img/1_7.png b/assets/1_7.png similarity index 100% rename from img/1_7.png rename to assets/1_7.png diff --git a/img/1_8.png b/assets/1_8.png similarity index 100% rename from img/1_8.png rename to assets/1_8.png diff --git a/img/1_9.png b/assets/1_9.png similarity index 100% rename from img/1_9.png rename to assets/1_9.png diff --git a/img/2_1.png b/assets/2_1.png similarity index 100% rename from img/2_1.png rename to assets/2_1.png diff --git a/img/2_2.png b/assets/2_2.png similarity index 100% rename from img/2_2.png rename to assets/2_2.png diff --git a/img/2_3.png b/assets/2_3.png similarity index 100% rename from img/2_3.png rename to assets/2_3.png diff --git a/img/2_4.png b/assets/2_4.png similarity index 100% rename from img/2_4.png rename to assets/2_4.png diff --git a/img/2_5.png b/assets/2_5.png similarity index 100% rename from img/2_5.png rename to assets/2_5.png diff --git a/img/2_6.png b/assets/2_6.png similarity index 100% rename from img/2_6.png rename to assets/2_6.png diff --git a/img/2_7.png b/assets/2_7.png similarity index 100% rename from img/2_7.png rename to assets/2_7.png diff --git a/img/2_8.png b/assets/2_8.png similarity index 100% rename from img/2_8.png rename to assets/2_8.png diff --git a/img/2_9.png b/assets/2_9.png similarity index 100% rename from img/2_9.png rename to assets/2_9.png diff --git a/img/4_1.png b/assets/4_1.png similarity index 100% rename from img/4_1.png rename to assets/4_1.png diff --git a/img/4_2.png b/assets/4_2.png similarity index 100% rename from img/4_2.png rename to assets/4_2.png diff --git a/img/4_3.png b/assets/4_3.png similarity index 100% rename from img/4_3.png rename to assets/4_3.png diff --git a/img/4_4.png b/assets/4_4.png similarity index 100% rename from img/4_4.png rename to assets/4_4.png diff --git a/img/4_5.png b/assets/4_5.png similarity index 100% rename from img/4_5.png rename to assets/4_5.png diff --git a/img/4_6.png b/assets/4_6.png similarity index 100% rename from img/4_6.png rename to assets/4_6.png diff --git a/img/7_1.png b/assets/7_1.png similarity index 100% rename from img/7_1.png rename to assets/7_1.png diff --git a/img/7_2.png b/assets/7_2.png similarity index 100% rename from img/7_2.png rename to assets/7_2.png diff --git a/img/7_3.png b/assets/7_3.png similarity index 100% rename from img/7_3.png rename to assets/7_3.png diff --git a/img/7_4.png b/assets/7_4.png similarity index 100% rename from img/7_4.png rename to assets/7_4.png diff --git a/img/8_1.png b/assets/8_1.png similarity index 100% rename from img/8_1.png rename to assets/8_1.png diff --git a/img/8_2.png b/assets/8_2.png similarity index 100% rename from img/8_2.png rename to assets/8_2.png diff --git a/img/8_3.png b/assets/8_3.png similarity index 100% rename from img/8_3.png rename to assets/8_3.png diff --git a/img/8_4.png b/assets/8_4.png similarity index 100% rename from img/8_4.png rename to assets/8_4.png diff --git a/img/8_5.png b/assets/8_5.png similarity index 100% rename from img/8_5.png rename to assets/8_5.png diff --git a/img/8_6.png b/assets/8_6.png similarity index 100% rename from img/8_6.png rename to assets/8_6.png diff --git a/img/9_1.png b/assets/9_1.png similarity index 100% rename from img/9_1.png rename to assets/9_1.png diff --git a/img/9_2.png b/assets/9_2.png similarity index 100% rename from img/9_2.png rename to assets/9_2.png diff --git a/img/Clever main.png b/assets/Clever main.png similarity index 100% rename from img/Clever main.png rename to assets/Clever main.png diff --git a/img/Clevermain.png b/assets/Clevermain.png similarity index 100% rename from img/Clevermain.png rename to assets/Clevermain.png diff --git a/img/addEqipment.jpg b/assets/addEqipment.jpg similarity index 100% rename from img/addEqipment.jpg rename to assets/addEqipment.jpg diff --git a/img/airframeSetup.jpg b/assets/airframeSetup.jpg similarity index 100% rename from img/airframeSetup.jpg rename to assets/airframeSetup.jpg diff --git a/img/allElements.png b/assets/allElements.png similarity index 100% rename from img/allElements.png rename to assets/allElements.png diff --git a/img/attentionSave.jpg b/assets/attentionSave.jpg similarity index 100% rename from img/attentionSave.jpg rename to assets/attentionSave.jpg diff --git a/img/brrc2205.png b/assets/brrc2205.png similarity index 100% rename from img/brrc2205.png rename to assets/brrc2205.png diff --git a/img/brrc2205on.png b/assets/brrc2205on.png similarity index 100% rename from img/brrc2205on.png rename to assets/brrc2205on.png diff --git a/img/brrc2205ondeck.png b/assets/brrc2205ondeck.png similarity index 100% rename from img/brrc2205ondeck.png rename to assets/brrc2205ondeck.png diff --git a/img/calibrateESC.jpg b/assets/calibrateESC.jpg similarity index 100% rename from img/calibrateESC.jpg rename to assets/calibrateESC.jpg diff --git a/img/calibratePIDparams.jpg b/assets/calibratePIDparams.jpg similarity index 100% rename from img/calibratePIDparams.jpg rename to assets/calibratePIDparams.jpg diff --git a/img/calibrateView.jpg b/assets/calibrateView.jpg similarity index 100% rename from img/calibrateView.jpg rename to assets/calibrateView.jpg diff --git a/img/calibrateViewStart.jpg b/assets/calibrateViewStart.jpg similarity index 100% rename from img/calibrateViewStart.jpg rename to assets/calibrateViewStart.jpg diff --git a/img/calibrateaxcel.jpg b/assets/calibrateaxcel.jpg similarity index 100% rename from img/calibrateaxcel.jpg rename to assets/calibrateaxcel.jpg diff --git a/img/calibrateaxcelstart.jpg b/assets/calibrateaxcelstart.jpg similarity index 100% rename from img/calibrateaxcelstart.jpg rename to assets/calibrateaxcelstart.jpg diff --git a/img/calibratecompass.jpg b/assets/calibratecompass.jpg similarity index 100% rename from img/calibratecompass.jpg rename to assets/calibratecompass.jpg diff --git a/img/calibrategyro.jpg b/assets/calibrategyro.jpg similarity index 100% rename from img/calibrategyro.jpg rename to assets/calibrategyro.jpg diff --git a/img/casebattery.png b/assets/casebattery.png similarity index 100% rename from img/casebattery.png rename to assets/casebattery.png diff --git a/img/chooseSwitch.jpg b/assets/chooseSwitch.jpg similarity index 100% rename from img/chooseSwitch.jpg rename to assets/chooseSwitch.jpg diff --git a/img/clever.jpg b/assets/clever.jpg similarity index 100% rename from img/clever.jpg rename to assets/clever.jpg diff --git a/img/connectBattery.png b/assets/connectBattery.png similarity index 100% rename from img/connectBattery.png rename to assets/connectBattery.png diff --git a/img/connectingRadio.png b/assets/connectingRadio.png similarity index 100% rename from img/connectingRadio.png rename to assets/connectingRadio.png diff --git a/img/connectionESCtoReceiver.png b/assets/connectionESCtoReceiver.png similarity index 100% rename from img/connectionESCtoReceiver.png rename to assets/connectionESCtoReceiver.png diff --git a/img/connectionLost.jpg b/assets/connectionLost.jpg similarity index 100% rename from img/connectionLost.jpg rename to assets/connectionLost.jpg diff --git a/img/connectionOK.jpg b/assets/connectionOK.jpg similarity index 100% rename from img/connectionOK.jpg rename to assets/connectionOK.jpg diff --git a/img/connectionPixhawk.png b/assets/connectionPixhawk.png similarity index 100% rename from img/connectionPixhawk.png rename to assets/connectionPixhawk.png diff --git a/img/consistofTransmitter.jpg b/assets/consistofTransmitter.jpg similarity index 100% rename from img/consistofTransmitter.jpg rename to assets/consistofTransmitter.jpg diff --git a/img/cutwire14AWG.jpg b/assets/cutwire14AWG.jpg similarity index 100% rename from img/cutwire14AWG.jpg rename to assets/cutwire14AWG.jpg diff --git a/img/escDYSzap.png b/assets/escDYSzap.png similarity index 100% rename from img/escDYSzap.png rename to assets/escDYSzap.png diff --git a/img/escWires.png b/assets/escWires.png similarity index 100% rename from img/escWires.png rename to assets/escWires.png diff --git a/img/explosion.png b/assets/explosion.png similarity index 100% rename from img/explosion.png rename to assets/explosion.png diff --git a/img/firmwarePX4.jpg b/assets/firmwarePX4.jpg similarity index 100% rename from img/firmwarePX4.jpg rename to assets/firmwarePX4.jpg diff --git a/img/flightModes.jpg b/assets/flightModes.jpg similarity index 100% rename from img/flightModes.jpg rename to assets/flightModes.jpg diff --git a/img/helphand.jpg b/assets/helphand.jpg similarity index 100% rename from img/helphand.jpg rename to assets/helphand.jpg diff --git a/img/holderLegs.png b/assets/holderLegs.png similarity index 100% rename from img/holderLegs.png rename to assets/holderLegs.png diff --git a/img/isoViewmountHolder.png b/assets/isoViewmountHolder.png similarity index 100% rename from img/isoViewmountHolder.png rename to assets/isoViewmountHolder.png diff --git a/img/jumper.png b/assets/jumper.png similarity index 100% rename from img/jumper.png rename to assets/jumper.png diff --git a/img/keep.png b/assets/keep.png similarity index 100% rename from img/keep.png rename to assets/keep.png diff --git a/img/lockradio.jpg b/assets/lockradio.jpg similarity index 100% rename from img/lockradio.jpg rename to assets/lockradio.jpg diff --git a/img/lockradio.png b/assets/lockradio.png similarity index 100% rename from img/lockradio.png rename to assets/lockradio.png diff --git a/img/lowsafeDeck.png b/assets/lowsafeDeck.png similarity index 100% rename from img/lowsafeDeck.png rename to assets/lowsafeDeck.png diff --git a/img/mainWindow.jpg b/assets/mainWindow.jpg similarity index 100% rename from img/mainWindow.jpg rename to assets/mainWindow.jpg diff --git a/img/motorsTopview.png b/assets/motorsTopview.png similarity index 100% rename from img/motorsTopview.png rename to assets/motorsTopview.png diff --git a/img/mount5vconnector.png b/assets/mount5vconnector.png similarity index 100% rename from img/mount5vconnector.png rename to assets/mount5vconnector.png diff --git a/img/mountAntenna.png b/assets/mountAntenna.png similarity index 100% rename from img/mountAntenna.png rename to assets/mountAntenna.png diff --git a/img/mountBeams.png b/assets/mountBeams.png similarity index 100% rename from img/mountBeams.png rename to assets/mountBeams.png diff --git a/img/mountBottomDeck.png b/assets/mountBottomDeck.png similarity index 100% rename from img/mountBottomDeck.png rename to assets/mountBottomDeck.png diff --git a/img/mountHolder.png b/assets/mountHolder.png similarity index 100% rename from img/mountHolder.png rename to assets/mountHolder.png diff --git a/img/mountPDB.png b/assets/mountPDB.png similarity index 100% rename from img/mountPDB.png rename to assets/mountPDB.png diff --git a/img/mountReceiverDeck.png b/assets/mountReceiverDeck.png similarity index 100% rename from img/mountReceiverDeck.png rename to assets/mountReceiverDeck.png diff --git a/img/mountReceiverStud.png b/assets/mountReceiverStud.png similarity index 100% rename from img/mountReceiverStud.png rename to assets/mountReceiverStud.png diff --git a/img/mountxt60pinsocket.png b/assets/mountxt60pinsocket.png similarity index 100% rename from img/mountxt60pinsocket.png rename to assets/mountxt60pinsocket.png diff --git a/img/notmoveslider.jpg b/assets/notmoveslider.jpg similarity index 100% rename from img/notmoveslider.jpg rename to assets/notmoveslider.jpg diff --git a/img/pixhawk.png b/assets/pixhawk.png similarity index 100% rename from img/pixhawk.png rename to assets/pixhawk.png diff --git a/img/radioTransmitter.png b/assets/radioTransmitter.png similarity index 100% rename from img/radioTransmitter.png rename to assets/radioTransmitter.png diff --git a/img/readyBatteryholder.png b/assets/readyBatteryholder.png similarity index 100% rename from img/readyBatteryholder.png rename to assets/readyBatteryholder.png diff --git a/img/receiver5V.png b/assets/receiver5V.png similarity index 100% rename from img/receiver5V.png rename to assets/receiver5V.png diff --git a/img/receiverPPM.png b/assets/receiverPPM.png similarity index 100% rename from img/receiverPPM.png rename to assets/receiverPPM.png diff --git a/img/resolderingESC.png b/assets/resolderingESC.png similarity index 100% rename from img/resolderingESC.png rename to assets/resolderingESC.png diff --git a/img/safeLegs.png b/assets/safeLegs.png similarity index 100% rename from img/safeLegs.png rename to assets/safeLegs.png diff --git a/img/safehighRadial.png b/assets/safehighRadial.png similarity index 100% rename from img/safehighRadial.png rename to assets/safehighRadial.png diff --git a/img/safelowRadial.png b/assets/safelowRadial.png similarity index 100% rename from img/safelowRadial.png rename to assets/safelowRadial.png diff --git a/img/safetyINflight.png b/assets/safetyINflight.png similarity index 100% rename from img/safetyINflight.png rename to assets/safetyINflight.png diff --git a/img/safetyPower.png b/assets/safetyPower.png similarity index 100% rename from img/safetyPower.png rename to assets/safetyPower.png diff --git a/img/safetyPreflight.png b/assets/safetyPreflight.png similarity index 100% rename from img/safetyPreflight.png rename to assets/safetyPreflight.png diff --git a/img/safetybyassem.png b/assets/safetybyassem.png similarity index 100% rename from img/safetybyassem.png rename to assets/safetybyassem.png diff --git a/img/soldering5VTOpdb.png b/assets/soldering5VTOpdb.png similarity index 100% rename from img/soldering5VTOpdb.png rename to assets/soldering5VTOpdb.png diff --git a/img/solderingBrrc2205ondeckTOescDYSzap.png b/assets/solderingBrrc2205ondeckTOescDYSzap.png similarity index 100% rename from img/solderingBrrc2205ondeckTOescDYSzap.png rename to assets/solderingBrrc2205ondeckTOescDYSzap.png diff --git a/img/solderingPowerwires.png b/assets/solderingPowerwires.png similarity index 100% rename from img/solderingPowerwires.png rename to assets/solderingPowerwires.png diff --git a/img/solderingxt60socketTOpdb.png b/assets/solderingxt60socketTOpdb.png similarity index 100% rename from img/solderingxt60socketTOpdb.png rename to assets/solderingxt60socketTOpdb.png diff --git a/img/stand.jpg b/assets/stand.jpg similarity index 100% rename from img/stand.jpg rename to assets/stand.jpg diff --git a/img/startPDBtest.jpg b/assets/startPDBtest.jpg similarity index 100% rename from img/startPDBtest.jpg rename to assets/startPDBtest.jpg diff --git a/img/testMotors.png b/assets/testMotors.png similarity index 100% rename from img/testMotors.png rename to assets/testMotors.png diff --git a/img/topESCcaseview.png b/assets/topESCcaseview.png similarity index 100% rename from img/topESCcaseview.png rename to assets/topESCcaseview.png diff --git a/img/topPreview.png b/assets/topPreview.png similarity index 100% rename from img/topPreview.png rename to assets/topPreview.png diff --git a/img/topviewmountPDB.png b/assets/topviewmountPDB.png similarity index 100% rename from img/topviewmountPDB.png rename to assets/topviewmountPDB.png diff --git a/img/topviewpixhawk.png b/assets/topviewpixhawk.png similarity index 100% rename from img/topviewpixhawk.png rename to assets/topviewpixhawk.png diff --git a/img/turnoffSafetyswitch.jpg b/assets/turnoffSafetyswitch.jpg similarity index 100% rename from img/turnoffSafetyswitch.jpg rename to assets/turnoffSafetyswitch.jpg diff --git a/img/xt60pinsocket.jpg b/assets/xt60pinsocket.jpg similarity index 100% rename from img/xt60pinsocket.jpg rename to assets/xt60pinsocket.jpg diff --git a/img/zap.jpg b/assets/zap.jpg similarity index 100% rename from img/zap.jpg rename to assets/zap.jpg diff --git a/img/zapPDBtest.jpg b/assets/zapPDBtest.jpg similarity index 100% rename from img/zapPDBtest.jpg rename to assets/zapPDBtest.jpg diff --git a/docs/3g.md b/docs/3g.md index 1fe51dfe..a7972619 100644 --- a/docs/3g.md +++ b/docs/3g.md @@ -1,4 +1,4 @@ Использование внешнего 3G-модема === -TODO \ No newline at end of file +TODO diff --git a/docs/assemble.md b/docs/assemble.md index c8c6028e..8314be74 100644 --- a/docs/assemble.md +++ b/docs/assemble.md @@ -1,12 +1,12 @@ Инструкция по сборке конструктора Клевер 2 ========================================== -![Clever](../img/Clevermain.png) +![Clever](../assets/Clevermain.png) Состав конструктора ------------------- -![Explosion](../img/explosion.png) +![Explosion](../assets/explosion.png) * Рама центральная x2. * Рама дополнительная х4. @@ -76,7 +76,7 @@ 16. Ручка A (VrA). 17. Ручка B (VrB). -![radio Transmitter](../img/radioTransmitter.png) +![radio Transmitter](../assets/radioTransmitter.png) Дополнительное оборудование @@ -92,7 +92,7 @@ 7. Канцелярский нож 8. Мультиметр -![Дополнительное оборудование](../img/addEqipment.jpg) +![Дополнительное оборудование](../assets/addEqipment.jpg) ![Техника безопасности при пайке](../docs/tb.md) @@ -104,7 +104,7 @@ * Распаковать моторы. Используя плоскогубцы, укоротить провода на моторах, обрезать половину длины (оставив 25 мм). -![Мотор brrc2205](../img/brrc2205.png) +![Мотор brrc2205](../assets/brrc2205.png) Зачистить * снять 2мм термоизоляции с конца провода не повредив медные жилы. @@ -115,18 +115,18 @@ * Нанести флюс на оголенную часть провода. * Покрыть припоем, используя пинцет. -![Лужение](../img/zap.jpg) +![Лужение](../assets/zap.jpg) #### Закрепить мотор на луче * Установить мотор на сторону луча с гравировкой. * Прикрепить моторы к лучам винтами М3х8, используя отвертку. -![Закрепить мотор на луче](../img/brrc2205on.png) +![Закрепить мотор на луче](../assets/brrc2205on.png) * Лучи с моторами необходимо расположить согласно схеме. Стрелками указано направление вращения моторов. -![Вращение моторов](../img/brrc2205ondeck.png) +![Вращение моторов](../assets/brrc2205ondeck.png) //указать стрелками направление вращения на моторах #### Залудить три контактные площадки регулятора @@ -135,13 +135,13 @@ Чтобы припой аккуратно заполнил всю площадку, необходимо прогреть площадку регулятора. Для этого нужно удерживать жало паяльника на контактной плащадке в течение 2 сек (или больше, если потребуется) -![Лужение контактных площадок регуляторов](../img/escDYSzap.png) +![Лужение контактных площадок регуляторов](../assets/escDYSzap.png) * Повторить данную операцию для оставшихся трех регуляторов #### Припаять провода моторов к регуляторам Припаять ранее приготовленные провода моторов к контактным площадкам регуляторов. -![Припаять провода моторов к регуляторам](../img/solderingBrrc2205ondeckTOescDYSzap.png) +![Припаять провода моторов к регуляторам](../assets/solderingBrrc2205ondeckTOescDYSzap.png) * Повторить данную операцию для оставшихся трех регуляторов @@ -155,13 +155,13 @@ * Длина 7 см (Для силового разъема XT60 pin) - 1 красный, 1 черный * Длина 9 см (Для силового разъема XT60 socket) - 1 красный, 1 черный -![Подготовка проводов для силового разъема](../img/cutwire14AWG.jpg) +![Подготовка проводов для силового разъема](../assets/cutwire14AWG.jpg) #### Подготовка силовых разъемов питания XT60 pin и XT60 socket ![Статья про силовые разъемы и их обозначения](../notes/powerConnection.md) -![Силовой разъем XT60](../img/xt60pinsocket.jpg) +![Силовой разъем XT60](../assets/xt60pinsocket.jpg) 1. Под разъем XT60 pin залудить два силовых провода красный и чёрный 14AWG длиной 7 см. 2. Залудить контактные площадки разъема XT60 pin. @@ -171,7 +171,7 @@ 6. Надеть термоусадку ф5 на провода так, чтобы она закрывала контактные площадки проводов с XT60 . 7. Усадить термоусадку феном. -![Монтаж разъемов XT60](../img/mountxt60pinsocket.png) +![Монтаж разъемов XT60](../assets/mountxt60pinsocket.png) 8. Повторить процедуру для разъема XT60 socket. @@ -183,7 +183,7 @@ 3. Убрать 3-й (оранжевый) провод из разъема, за ненадобностью. 4. Длина оставшихся черного и красного проводов 10-12 см. -![Монтаж разъема 5В](../img/mount5vconnector.png) *было бы круто, если делать такие картинки и в формате гифки +![Монтаж разъема 5В](../assets/mount5vconnector.png) *было бы круто, если делать такие картинки и в формате гифки ### Монтаж платы распределения питания @@ -193,7 +193,7 @@ ![Статья про прозвонку](/notes/testConnection.md) -![Предпаячная проверка](../img/startPDBtest.jpg) +![Предпаячная проверка](../assets/startPDBtest.jpg) Прозвонить следующие цепи на НЕЗАМКНУТОСТЬ (отсутствие звукового сигнала мультиметра): * “BAT+” и “BAT-” @@ -208,14 +208,14 @@ 1. ![Залудить*](../notes/zap.md) контактные площадки платы питания. 2. С помощью мультиметра проверить отсутствие контактного замыкания на плате (прозвонить) -![Постпаячная проверка](../img/zapPDBtest.jpg) +![Постпаячная проверка](../assets/zapPDBtest.jpg) Чтобы припой аккуратно заполнил всю площадку, необходимо её прогреть. Для этого нужно удерживать жало паяльника на контактной плащадке в течение 2 сек (или больше, если потребуется) #### Пайка силового разъема питания XT60 Припаять разъем для АКБ, соблюдая полярность на контактных площадках. -![Пайка XT60 на PDB](../img/solderingxt60socketTOpdb.png) +![Пайка XT60 на PDB](../assets/solderingxt60socketTOpdb.png) ВАЖНО о полярности * красный провод - это “+” @@ -225,12 +225,12 @@ Припаять разъем 5В, соблюдая полярность на контактных площадках. (на изображении: красный провод - это питание “+”) -![Пайка 5В на PDB](../img/soldering5VTOpdb.png) +![Пайка 5В на PDB](../assets/soldering5VTOpdb.png) ### Монтаж отсека АКБ #### Подготовка перемычек (3 шт.) -![Перемычка](../img/jumper.png) +![Перемычка](../assets/jumper.png) * Отрезать силовой провод длиной 2 см. * Зачистить с обеих сторон. @@ -240,7 +240,7 @@ * Прозвонить мультиметром. В случае необходимости зачистить наждачной бумагой. #### Подготовка отсека АКБ -![Подготовка отсека АКБ](../img/casebattery.png) +![Подготовка отсека АКБ](../assets/casebattery.png) * Приклеить наклейки с разметкой внутрь отсека АКБ, в соответствии с полярностью. * Приклеить ленту из скотча на дно отсека. @@ -248,34 +248,34 @@ ### Монтаж платы распределения питания * Установить плату питания на раму винтами М3х8 и пластиковыми гайками. -![Установка платы PDB](../img/mountPDB.png) +![Установка платы PDB](../assets/mountPDB.png) * ВАЖНО Стрелочка на плате направлена в сторону носового выреза -![Установка платы PDB](../img/topviewmountPDB.png) +![Установка платы PDB](../assets/topviewmountPDB.png) #### Монтаж элементов 1. Установить гайки в пластиковые держатели -![Монтаж пластиковых держателей](../img/holderLegs.png) +![Монтаж пластиковых держателей](../assets/holderLegs.png) 2. Установить лучи на раму винтами М3х16 *Лучи устанавливаются поверх рамы *Пластиковые держатели устанавливаются снизу рамы -![Монтаж лучей](../img/mountBeams.png) +![Монтаж лучей](../assets/mountBeams.png) 3. Расположение моторов Проверить расположение моторов (моторы с черной гайкой в левом верхнем углу и в правом нижнем). -![Расположение моторов](../img/motorsTopview.png) +![Расположение моторов](../assets/motorsTopview.png) 4. Продеть силовые провода регуляторов в отверстия. -![силовые провода моторов](../img/escWires.png) +![силовые провода моторов](../assets/escWires.png) #### Пайка силовой цепи платы питания Припаять силовые провода регуляторов к плате питания, соблюдая полярность. -![Пайка силовых проводов на PDB](../img/solderingPowerwires.png) +![Пайка силовых проводов на PDB](../assets/solderingPowerwires.png) ВАЖНО о полярности *красный провод - это “+” @@ -284,14 +284,14 @@ ### Сопряжение приемника и пульта 1. Подключить радиоприемник к разъему 5В. В любой разъем, GND внизу. На схеме питание обозначено как 5V -![Подключение питания приемника](../img/receiver5V.png) +![Подключение питания приемника](../assets/receiver5V.png) 3. Подключить АКБ. Светодиод на радиоприемнике должен мигать. -![Подключение АКБ](../img/connectBattery.png) +![Подключение АКБ](../assets/connectBattery.png) #### БЕЗОПАСНОСТЬ при работе с АКБ -![БЕЗОПАСНОСТЬ при работе с АКБ](../img/safetyPower.png) +![БЕЗОПАСНОСТЬ при работе с АКБ](../assets/safetyPower.png) #### Включение радиопульта 1. На пульте зажать кнопку BIND KEY. @@ -300,45 +300,45 @@ 4. Отсоединить джампер. 5. Светодиод горит непрерывно. -![Подключение питания приемника](../img/connectingRadio.png) +![Подключение питания приемника](../assets/connectingRadio.png) ![Мануал по неисправностям](../docs/radioerrors1.md) ### Проверка направления вращения моторов 1. Наклеить наклейки на АКБ 18650. 2. Установить 18650 в отсек АКБ, соблюдая полярность. -![Готовность отсека АКБ](../img/readyBatteryholder.png) +![Готовность отсека АКБ](../assets/readyBatteryholder.png) 3. Проверить, что разъем питания 5В подключен к приемнику по схеме. 4. Подключить регулятор мотора к 3 каналу приемника CH3 по схеме. -![Подключение регулятора к приемнику](../img/connectionESCtoReceiver.png) +![Подключение регулятора к приемнику](../assets/connectionESCtoReceiver.png) 5. Подключить внешнее питание (АКБ). 6. Включить пульт. 7. Подать левым стиком газ (throttle) на 10%. 8. Проверить направления вращения мотора по схеме. -![Проверка вращения моторов](../img/testMotors.png) +![Проверка вращения моторов](../assets/testMotors.png) 9. Если необходимо изменить направление вращения, то меняем любые два фазных провода мотора (нужно перепаять). -![Перепайка фазных проводов](../img/resolderingESC.png) +![Перепайка фазных проводов](../assets/resolderingESC.png) ### Монтаж радиоприемника 1. Установить пластиковые стойки 30 мм на раму винтами М3х8. 2. Разъем питания 5В продеть в прорезь. -![Установка стоек и прорезь](../img/mountReceiverStud.png) +![Установка стоек и прорезь](../assets/mountReceiverStud.png) 3. Приемник прикрепить к ![нижней дополнительной раме*](../notes/deck.md), используя двухсторонний скотч и ориентируясь на гравировку. Антенны направлены вперед. - ![Установка радиоприемника на деку](../img/mountReceiverDeck.png) + ![Установка радиоприемника на деку](../assets/mountReceiverDeck.png) 4. Установить 3х проводной шлейф в канал PPM / CH1. -![Подключение радиоприемника](../img/receiverPPM.png) +![Подключение радиоприемника](../assets/receiverPPM.png) 5. Продеть в прорезь к разъему 5 В. 6. Прикрутить нижнюю дополнительную раму к стойкам на центральной раме винтами М3х8. -![Установка нижней деки](../img/mountBottomDeck.png) +![Установка нижней деки](../assets/mountBottomDeck.png) ##### ВАЖНО Направление стрелок на плате питания и на раме дополнительной совпадают @@ -346,11 +346,11 @@ ### Монтаж полетного контроллера #### Переворачиваем сборку -![Переворачиваем сборку](../img/topPreview.png) +![Переворачиваем сборку](../assets/topPreview.png) #### Установка полетного контроллера Pixhawk 1. Клеим 2х сторонний скотч по углам полетного контроллера - ![Полетный контроллер](../img/pixhawk.png) + ![Полетный контроллер](../assets/pixhawk.png) ##### ВАЖНО При работе моторов возникают вибрации, отрицательно влияющие на показания датчиков полетного контроллера Pixhawk. Чтобы избежать этого эффекта, количество слоев двустороннего скотча @@ -358,7 +358,7 @@ 2. Установить полетный контроллер в центр рамы - ![Полетный контроллер](../img/topviewpixhawk.png) + ![Полетный контроллер](../assets/topviewpixhawk.png) ##### ВАЖНО Стрелки на раме и pixhawk должны быть сонаправлены @@ -368,29 +368,29 @@ 2. Моторы к 1,2,3,4 портам MAIN OUT, согласно схеме 3. Питание от PDB (5В/VCC) в любой порт, кроме SB (SBUS) - ![Подключение полетного контроллера](../img/connectionPixhawk.png) + ![Подключение полетного контроллера](../assets/connectionPixhawk.png) ### Сборка регуляторов 1. Клеим 2х сторонний скотч на основание защитного бокса регуляторов -![Скотч на бокс регулей](../img/escCase.png) +![Скотч на бокс регулей](../assets/escCase.png) 2. Укладываем регуляторы в защитные боксы. Крепим полученную сборку к лучам рамы. -![Вид сверху с боксами для регулей](../img/topESCcaseview.png) +![Вид сверху с боксами для регулей](../assets/topESCcaseview.png) ### Установка защиты 1. Закрепить нижнюю защиту винтами М3х16 на лучах рамы -![Установка лучевой защиты](../img/lowsafeDeck.png) +![Установка лучевой защиты](../assets/lowsafeDeck.png) 2. Закрепить ножки к пластиковым держателям винтами М3х16 -![Установка ножек](../img/safeLegs.png) +![Установка ножек](../assets/safeLegs.png) 3. Закрепить стойки 30 мм в отверстия нижней защиты винтами М3х12 -![Установка нижней радиальной защиты](../img/safelowRadial.png) +![Установка нижней радиальной защиты](../assets/safelowRadial.png) 4. Закрепить верхнюю защиту винтами М3х12 -![Установка верхней радиальной защиты](../img/safehighRadial.png) +![Установка верхней радиальной защиты](../assets/safehighRadial.png) ### Монтаж отсека АКБ @@ -402,11 +402,11 @@ * Батарейный отсек (1 шт) 1. Прикрепить батарейный отсек на верхнюю дополнительную раму винтами М3х12 и гайками. -![Монтаж отсека АКБ](../img/mountHolder.png) +![Монтаж отсека АКБ](../assets/mountHolder.png) 2. Прикрепить верхнюю дополнительную раму на стойки винтами М3х8. -![Монтаж отсека АКБ](../img/isoViewmountHolder.png) +![Монтаж отсека АКБ](../assets/isoViewmountHolder.png) 3. Установить АКБ в отсек. @@ -415,7 +415,7 @@ 1. Крепим антенны на 2х сторонний скотч или изоленту, а усики продеваем в передние отверстия верхней дополнительной рамы. -![Монтаж отсека АКБ](../img/mountAntenna.png) +![Монтаж отсека АКБ](../assets/mountAntenna.png) Коптер готов к настройке! @@ -430,7 +430,7 @@ 3. Позвать на помощь “Если при выполнении работ возникли какие-либо проблемы, необходимо обратиться к преподавателю или учителю, а не пытаться решить проблему самостоятельно.” -![Безопасность при сборке](../img/safetybyassem.png) +![Безопасность при сборке](../assets/safetybyassem.png) ## Безопасность при работе с Li-ion аккумуляторами 18650 diff --git a/docs/etcher.md b/docs/etcher.md index 178a19da..089d567b 100644 --- a/docs/etcher.md +++ b/docs/etcher.md @@ -1,4 +1,4 @@ Использование программы Etcher === -TODO \ No newline at end of file +TODO diff --git a/docs/frames.md b/docs/frames.md index eca8ba7b..9dbd0458 100644 --- a/docs/frames.md +++ b/docs/frames.md @@ -9,4 +9,4 @@ * `fcu` — координаты относительно квадрокоптера: схематичное изображение квадрокоптера на иллюстрации; * `fcu_horiz` — координаты относительно квадрокоптера без учета наклонов по тангажу и рысканью: красная, синия и зеленая линии на иллюстрации. -Более наглядно 3D визуализацию систем координат можно наблдюдать, используя [rviz](/docs/rviz.md). \ No newline at end of file +Более наглядно 3D визуализацию систем координат можно наблдюдать, используя [rviz](/docs/rviz.md). diff --git a/docs/les1.md b/docs/les1.md index ec9af942..45e8fb18 100644 --- a/docs/les1.md +++ b/docs/les1.md @@ -8,19 +8,19 @@ В 1899 году на выставке в Мэдисон-Сквер-Гарден инженер и изобретатель Никола Тесла продемонстрировал миниатюрное радиоуправляемое судно. Несмотря на то, что общественность в первую очередь заинтересовало военное применение его изобретения, сам Тесла указывал на потенциально гораздо более широкое применение дистанционного управления (названного изобретателем «телеавтоматикой»), например, в человекоподобных автоматонах. -![Tesla](../img/1_1.png) +![Tesla](../assets/1_1.png) ### «Жук» Кеттеринга Экспериментальная беспилотная «воздушная торпеда», один из первых проектов предшественников современных крылатых ракет. Разработана изобретателем Чарльзом Кеттерингом по заказу Армии США в 1917 году. Предназначалась для обстрела с дистанции до 120 км городов, крупных промышленных центров и мест сосредоточения войск противника. Отличался простотой конструкции и очень низкой ценой. Хотя аппарат сравнительно успешно прошёл испытания, Первая мировая война закончилась и снаряд так и остался опытным. -![Bug](../img/1_2.png) +![Bug](../assets/1_2.png) ### Вертолёт Ботезата Многовинтовые вертолёты разрабатывались ещё в первые годы вертолётостроения. Один из первых квадрокоптеров (англ. quadcopter, четырёхроторный вертолет), который реально оторвался от земли и мог держаться в воздухе, был создан Георгием Ботезатом и испытан в 1922 году. Недостатком этих аппаратов была сложная трансмиссия, передававшая вращение одного мотора на несколько винтов. Изобретение хвостового винта и автомата перекоса положило конец этим попыткам. Новые разработки начались в 1950-е годы, но дальше прототипов дело не продвинулось. -![Helicopter](../img/1_3.png) +![Helicopter](../assets/1_3.png) Применение коптеров ------------------- @@ -56,14 +56,14 @@ один из лучей направлен вперед, у «х»-платформ основное направление находится между двумя соседними лучами. -![Types](../img/1_4.png) +![Types](../assets/1_4.png) Управление ---------- Управление коптером осуществляется при помощи пульта управления, который передает команды радиоприемнику. Пульт питается от батареек, а радиоприемник получает питание от Полетного контроллера. Связь зачастую односторонняя, только от пульта к приемнику. Приемник подключается к полетному контроллеру минимум пятью проводами, по которым передаются сигналы поворота вокруг трех осей, команда «газа» и полетный режим. -![Control](../img/1_5.png) +![Control](../assets/1_5.png) **Throttle** — переводится как «дроссель», «тяга» или «газ» в обиходе. Газ мультикоптера — среднее арифметическое между скоростями вращения всех моторов. Чем больше газ, тем больше суммарная тяга моторов, и тем сильнее они тащат коптер вверх (проще говоря «Тапок в пол» здесь означает наискорейший подъем). Обычно измеряется в процентах: 0% — моторы остановлены, 100% — вращаются с максимальной скоростью. Газ висения — минимальный уровень газа, который необходим, чтобы коптер не терял высоту. @@ -71,15 +71,15 @@ **Yaw** – «рыскание». Поворот носа мультикоптера. условно - вращение вправо влево. -![Yaw](../img/1_6.png) +![Yaw](../assets/1_6.png) **Pitch** - «тангаж». В коптерах манипуляции с этим моментом силы позволяет коптеру двигаться вперед или назад за счет наклона носа в соответствующем направлении. -![Pitch](../img/1_7.png) +![Pitch](../assets/1_7.png) **Roll** - «крен». Наклон мультикоптера влево вправо. Коптер за счет крена может двигаться боком в соответствующую сторону. -![Roll](../img/1_8.png) +![Roll](../assets/1_8.png) Газ, тангаж, крен, рыскание — если вы можете управлять этими четырьмя параметрами, значит вы можете управлять квадрокоптером. Их еще иногда называют каналами управления. Режимов полета существует много. Используется и GPS, и барометр, и дальномер, так же режим стабилизации (stab, stabilize, летать в «стабе»), в котором квадрокоптер держит те углы, которые ему задаются с пульта не зависимо от внешних факторов. В этом режиме при отсутствии ветра квадрокоптер может висеть почти на месте. Ветер же придется компенсировать пилоту. Направление вращения винтов выбирается не случайно. Если бы все моторы вращались в одну сторону, квадрокоптер вращался бы в противоположную из-за создаваемых моментов. Поэтому одна пара противостоящих моторов всегда вращается в одну сторону, а другая пара — в другую. Эффект возникновения моментов вращения используется, чтобы изменять угол рыскания: одна пара моторов начинает вращаться чуть быстрее другой, и вот уже квадрокоптер медленно поворачивается к нам лицом: @@ -92,7 +92,7 @@ RBW — right back clockwise rotation (правый задний, вращение по часовой стрелке) - ![Parts](../img/1_9.png) + ![Parts](../assets/1_9.png) Элементы коптера ---------------- @@ -101,22 +101,22 @@ Именно здесь в игру вступают Полетные контроллеры. -![Flightctr](../img/1_10.png) +![Flightctr](../assets/1_10.png) **Полетный контроллер** - самая важная часть. Стабильность полета и управляемость на девяносто процентов зависит от способностей полетного контроллера. Задача полетного контроллера — переводить команды от пульта управления в сигналы задающие обороты двигателя. Также в нем установлены инерциальные измерительные датчики, позволяющие следить за текущим положением платформы и выполнять автоматические регулировки. -![Flightctr](../img/1_11.png) +![Flightctr](../assets/1_11.png) **ESC** — это регуляторы оборотов электродвигателей. Дело в том, что в мультикоптерах используют специальные бесколлекторные электродвигатели, которые способны работать на очень больших оборотах. Для управления этими двигателями необходимо формировать трехфазное напряжение и относительно большие токи, чем и занимаются регуляторы оборотов. Для каждого двигателя необходим свой регулятор оборотов. Все регулятора оборотов подключаются к полетному контроллеру. Питаются регуляторы непосредственно от аккумулятора. Каждый двигатель подключен к своему регулятору оборотов тремя проводами. Последовательность подключения проводов определяет направление вращения двигателя. -![Esc](../img/1_12.png) +![Esc](../assets/1_12.png) **Электродвигатель** В конструкциях коптеров используются бесколлекторные электродвигатели. Они обладают выдающимися характеристиками и живучестью в связи с отсутствием трущихся узлов (щеток) посредством которых передается ток. В отличие от обычного электродвигателя, у которого имеется подвижная часть - ротор и неподвижная - статор, у бесколлекторного двигателя подвижной частью является как раз статор с постоянными магнитами, а неподвижной частью - ротор с обмотками трех фаз. Для того, чтобы заставить вращаться такую систему, необходимо осуществлять в определенном порядке смену направления магнитного поля в обмотках ротора - тогда постоянные магниты статора будут взаимодействовать с магнитными полями ротора и подвижный статор прийдет в движение. Это движение основано на свойстве магнитов с одноименными полюсами полюсами отталкиваться, а с противоположными - притягиваться. -![Engine](../img/1_13.png) +![Engine](../assets/1_13.png) **Аппаратура радиоуправления** diff --git a/docs/les11.md b/docs/les11.md index a59a9361..dba134a1 100644 --- a/docs/les11.md +++ b/docs/les11.md @@ -10,7 +10,7 @@ Во время работы постоянно происходят химические реакции между компонентами электродных пластин с заполняющим их веществом — электролитом. Принципиальную схему устройства аккумулятора можно представить рисунком упрощенного вида, когда в корпус сосуда вставлены две пластины из разнородных металлов с выводами для обеспечения электрических контактов. Между пластинами залит электролит. -![bat](../img/11_1.png) +![bat](../assets/11_1.png) Работа аккумулятора при разряде ------------------------------- @@ -19,7 +19,7 @@ Этот процесс условно показан на схеме с никель-кадмиевой конструкцией электродов. -![bat](../img/11_2.png) +![bat](../assets/11_2.png) Здесь в качестве материала положительного электрода используют окислы никеля с добавками графита, которые повышают электрическую проводимость. Металлом отрицательного электрода работает губчатый кадмий. Во время разряда частицы активного кислорода из окислов никеля выделяются в электролит и направляются на отрицательные пластины, где окисляют кадмий. @@ -45,7 +45,7 @@ Двигатели квадрокоптера в зависимости от размера могут потреблять значительные токи. Основным требованием к аккумуляторам является высокая токоотдача. И наилучшими характеристиками с этой точки зрения обладают литий-полимерные аккумуляторы. -![bat](../img/11_3.png) +![bat](../assets/11_3.png) ### Характеристики LiPo аккумуляторов @@ -61,7 +61,7 @@ Для зарядки используется специальное зарядное устройство. Практически все модели питаются не от сети, а от постоянного напряжения 12В. -![bat](../img/11_4.png) +![bat](../assets/11_4.png) Особенность этого зарядного устройства в том, что он умеет делать балансировку ячеек аккумулятора. То есть аккумулятор подключается к нему не только силовым разъемом, но и дополнительным балансировочным разъемом на который выведены все ячейки по отдельности. Это дает возможность заряжать все ячейки равномерно, что дает одинаковое распределение нагрузки на банки аккумулятора в процессе эксплуатации. @@ -70,7 +70,7 @@ Для подключения аккумуляторов используют специальные коннекторы. Диаметр пистонов в них 4мм и они дополнительно подпружинены для обеспечения большой площади контакта. Еще для подключения используют специальные провода в силиконовой изоляции, которая способна выдерживать высокие температуры. -![bat](../img/11_5.png) +![bat](../assets/11_5.png) Меры предосторожности --------------------- diff --git a/docs/les13.md b/docs/les13.md index 177f0c8a..8bb16db1 100644 --- a/docs/les13.md +++ b/docs/les13.md @@ -6,7 +6,7 @@ Отличие мультикоптера от других подобных роботов (ездящих, плавающих), заключается в том, что пилот не управляет напрямую мощностью мотора. С помощью джойстика, он передает сигнал полётному контроллеру, который делает расчеты и передает необходимую мощность на моторы. -![Speed](../img/13_1.png) +![Speed](../assets/13_1.png) Рис. Скорость вращения моторов, в зависимости от команды пилота. @@ -17,7 +17,7 @@ Полётный контроллер - устройство, обеспечивающее полёт квадрокоптера, за счет управления газом, углами крена, тангажа и рысканья (throttle, pitch, roll, yaw). Это своеобразные "мозги" мультикоптера. Обычно он содержит несколько датчиков (гироскопы, акселерометр, магнитометр, GPS датчик) и микроконтроллер, который производит расчеты. Именно полётный контроллер отвечает за то, чтобы при среднем положении всех стиков джойстика квадрокоптер стабилизировался, висел в воздухе не отклоняясь ни в одну из сторон. -![FC](../img/13_2.png) +![FC](../assets/13_2.png) Полётный контроллер несколько десятков раз в секунду выполняет цикл управления в который входит: считывание показаний датчиков, считывание каналов управления, обработка информации и выдача управляющих сигналов моторам, чтобы выполнять команды пилота. @@ -35,7 +35,7 @@ Полётный контроллер выдает ШИМ-импульсы (PWM) на регуляторы оборотов (ESC), в зависимости от команды стика джойстика, либо программы. Например, чтобы дать команду мотору вращаться с максимальной скоростью контроллер должен отправлять импульсы длительностью 2 миллисекунды, перемежающиеся логическим нулем длительностью 10 — 20 миллисекунд. Длительности импульса в 1 миллисекунду соответствует остановка мотора, 1.1 мс — 10% от максимальной скорости, 1.2 мс — 20% и т.п. Длительность нуля не играет никакой роли, важна только длительность самого импульса. -![shim](../img/13_3.jpg) +![shim](../assets/13_3.jpg) Но все не так просто, полетные контроллеры бывают разные с разными настройками, регуляторы бывают разные, минимум (1 мс) и максимум (2 мс) — не универсальны. В зависимости от множества факторов диапазон 1-2 мс может на деле оказаться 1.1 — 1.9 мс, либо другим. Чтобы регулятор и контроллер говорили абсолютно на одном языке существует процедура калибровки регуляторов. @@ -48,7 +48,7 @@ Для многих устройств, использующих ПИД-регуляторы, существуют инструкции по настройке. Но чтобы легче ориентироваться в этом многообразии полезно понимать, как же внутри устроены эти регуляторы. Предлагаю вместе со мной самим заново «изобрести» и «на пальцах» понять формулу ПИД-регулятора. Будем рассматривать квадрокоптер в двумерном пространстве, где у него есть только один угол — угол крена, и два мотора: левый и правый. -![FC](../img/13_4.png) +![FC](../assets/13_4.png) В полетный контроллер непрерывно поступают команды с земли: «крен 30 градусов», «крен -10 градусов», «крен 0 градусов (держать горизонт)»; его задача — как можно быстрее и точнее их выполнять с помощью моторов с учетом: ветра, неравномерного распределения веса квадрокоптера, неравномерного износа моторов, инерции квадрокоптера и т.п. Таким образом, полетный контроллер должен непрерывно решать задачу, какую скорость вращения подавать на каждый мотор с учетом текущего значения угла крена и требуемого @@ -61,7 +61,7 @@ right = throttle - force,*** Представим ситуацию: поступает команда «держать горизонт» (***tar get_roll*** = 0), а квадрокоптер имеет крен влево: -![FC](../img/13_5.png) +![FC](../assets/13_5.png) Рис. Двухмерный квадрокоптер с креном влево. ***error*** — разность (ошибка) между ***tar get_roll*** и ***roll***, которую контроллер стремится минимизировать. @@ -82,15 +82,15 @@ D — настраиваемый коэффициент: чем он больш Скорость изменения любой величины — производная этой величины по времени: -![math](../img/13_6.png) +![math](../assets/13_6.png) И вот пропорциональный регулятор превращается в пропорционально-дифференциальный (пропорциональное слагаемое и дифференциальное): -![math](../img/13_7.png) +![math](../assets/13_7.png) Ошибку ***error*** вычислить легко, ведь на каждой итерации мы знаем ***roll*** и ***tar get_roll***; P и D — настраиваемые перед запуском параметры. Для вычисления производной (скорости изменения ***error***) необходимо хранить предыдущее значение ***error***, знать текущее значение ***error*** и знать время, которое прошло между измерениями (период регулирования). И вот она — физика шестого класса школы (скорость = расстояние / время): -![math](../img/13_8.png) +![math](../assets/13_8.png) ***dt*** — период регулирования; ***error previous*** — значение ошибки с предыдущей итерации цикла регуляции. Кстати, эта формула — простейший способ численного дифференцирования, и он нам здесь вполне подойдет. @@ -100,17 +100,17 @@ D — настраиваемый коэффициент: чем он больш Тут есть нюанс. Предположим ***error*** равна 1 градусу, цикл регулирования — 0.1с. Тогда за одну секунду сумма ошибок примет значение 10 градусов. А если цикл обработки — 0.01с, то сумма наберет аж 100 градусов. Чтобы за одно и тоже время интегральное слагаемое набирало одно и тоже значение при разных периодах регулирования, полученную сумму будем умножать на сам период регулирования. Легко посчитать, что в обоих случаях из примера получается сумма в 1 градус. Вот оно — интегральное слагаемое (пока без настраиваемого коэффициента): -![math](../img/13_9.png) +![math](../assets/13_9.png) Эта формула — не что иное, как численный интеграл по времени функции ***error*** в интервале от нуля до текущего момента. Именно поэтому слагаемое называется интегральным: -![math](../img/13_10.png) +![math](../assets/13_10.png) где T — текущий момент времени. Пришло время записать окончательную формулу пропорционально-интергрально-дифференциального регулятора: -![math](../img/13_11.png) +![math](../assets/13_11.png) где ***I*** — один из настраиваемых параметров, которых теперь трое: ***P,I,D***. ПИД регуляторы - важная часть полётного контроллера, без их использования квадрокоптер летал бы непредсказуемо. Они настраиваются индивидуально для каждого квадрокоптера. diff --git a/docs/les15.md b/docs/les15.md index 19dd74f5..e5931cf4 100644 --- a/docs/les15.md +++ b/docs/les15.md @@ -6,26 +6,26 @@ Радиосвязь - наиболее распространенный способ передачи информации на расстояние. Сотовые телефоны, спутниковая связь, телевиденье - все это работает на основе передачи сигналов через электромагнитные колебания определенной частоты. -![Radio](../img/15_1.png) +![Radio](../assets/15_1.png) В передатчике формируются высокочастотные колебания определенной частоты (несущий сигнал). На него накладывается сигнал, который нужно передать, это называется модуляция полезным сигналом. Сформированный таким образом высокочастотный сигнал излучается антенной в виде радиоволн. Этот сигнал воспринимается антенной приёмника, проходит через систему фильтров, которая выделяет из множества наведенных в антенне токов от различных передатчиков сигнал с нужной несущей частотой, а детектор выделяет из него модулирующий полезный сигнал. В зависимости от несущей частоты передатчика, излучаемый сигнал обладает разными характеристиками относительно дальности распространения, рассеивания, способности отражаться и огибать препятствия. Радиоволны распространяются в пустоте и в атмосфере; земная твердь и вода для них непрозрачны. Однако, благодаря эффектам дифракции и отражения, возможна связь между точками земной поверхности, не имеющими прямой видимости (в частности, находящимися на большом расстоянии). Примером модуляции сигнала может служить AM и FM. Это частные виды аналоговой модуляции в которых полезный сигнал передаётся либо за счет амплитуды волны, либо частоты. -![Radio](../img/15_2.png) +![Radio](../assets/15_2.png) ### Принцип работы радиоаппаратуры управления. Управление подвижными моделями основано на взаимодействии человека и модели, в нашем случае квадрокоптера. Аппаратура радиоуправления состоит из передатчика, который находится у пилота, и размещенных на модели приемника и полётного контроллера, который и управляет квадрокоптером через регуляторы мощности. О полётном контроллере и регуляторах мощности мы уже рассказывали, теперь рассмотрим Приёмник и передатчик. -![Radio](../img/15_3.png) +![Radio](../assets/15_3.png) ### Передатчик Различают 2 основных вида пультов - джойстиковые и пистолетные. Для квадрокоптеров используют джойстиковый пульт. -![Radio](../img/15_4.png) +![Radio](../assets/15_4.png) Для управления движущимися моделями требуется воздействие одновременно на несколько функций, поэтому передатчики радиоуправления делают многоканальными. Для квадрокоптеров минимальное количество каналов - 4: управление газом, угол крена, угол тангажа, угол рысканья. Положение каждого из стиков пульта кодируется при помощи ШИМ импульса. @@ -35,7 +35,7 @@ На выходе с пульта сигнал модулируется, чтобы передать данные на квадрокоптер. Модуляция сигнала позволяет наложить полезный сигнал на излучаемые волны, для этого все каналы уплотняются в один посредством кодирования. В основном для этого используется фазово-импульсная модуляция, обозначаемая буквами РРМ (Pulse Position Modulation), она распространена из-за единого стандарта на всем оборудовании. Пульт и приемник разных производителей могут работать вместе, привязка их друг к другу осуществляется за счет пары кварцевых резонаторов. -![Radio](../img/15_5.png) +![Radio](../assets/15_5.png) РРМ сигнал имеет фиксированную длину периода Т=20мс. Это означает, что информация о положениях ручек управления на передатчике попадает на модель 50 раз в секунду, что определяет быстродействие аппаратуры управления. Как правило, этого хватает, поскольку скорость реакции пилота на поведение модели намного меньше. Все каналы пронумерованы и передаются по порядку номеров. Значение сигнала в канале определяется величиною временного промежутка между первым и вторым импульсом - для первого канала, между вторым и третьим - для второго канала и т.д. @@ -45,13 +45,13 @@ Приёмник - устройство, служащее для осуществления радиоприёма, т.е . для выделения сигналов из радиоизлучения. Приёмник устанавливается на квадрокоптере, принимает сигнал с пульта и передаёт его в полётный контроллер. -![Radio](../img/15_6.png) +![Radio](../assets/15_6.png) ### Принципиальная схема работы приемника Сигналы, принятые антенной, подаются на колебательный контур, в котором работает приёмник. Этот контур является преселектором. После преселектора сигнал попадает в усилитель высокой частоты, а затем, уже усиленный сигнал подается на смеситель. На смеситель так же подается сигнал с гетеродина ( высокочастотного генератора). Антенна воспринимает сигналы со всех передатчиков, находящихся рядом, в смесителе происходит процесс первичной фильтрации сигнала. Из смесителя отфильтрованные сигналы поступают на селектор промежуточной частоты, который должен выбрать из всех полученных, сигнал "своего" приёмника и подавить остальные. После этого сигнал проходит через усилитель промежуточной частоты и попадает на демодулятор-дискримнатор, где сигнал проходит обратную модуляции процедуру, когда принятого сигнала выделяется полезный сигнал. Затем он попадает на триггер Шмидта, который формирует необходимую амплитуду и крутизну PPM сигнала, а затем подается на декодер полётного контроллера. -![Radio](../img/15_7.png) +![Radio](../assets/15_7.png) Чтобы было понятно, рассмотрим на примере. Наш передатчик и приемник осуществляют связь по 50 каналу, 40,665 МГц. Частота гетеродина, чтобы определить "свой" сигнал обычно отличается на 455 кГц (0,455 МГц), соответственно она равна 40,665 МГц - 0,455 МГц = 40,210 МГц. Например, антенна приняла сигналы 40,665 МГц и 40,805 МГц, что соответствует 50 и 80 каналам. Они усилились при помощи УВЧ и попали в смеситель. Чтобы найти "свой" сигнал в смесителе происходит сложение и вычитание частот полученных сигналов и гетеродина. Получим: diff --git a/docs/les16.md b/docs/les16.md index 2d1a3654..74a12a9a 100644 --- a/docs/les16.md +++ b/docs/les16.md @@ -8,14 +8,14 @@ ### Принцип работы аналоговых видеокамер -![Analog](../img/16_1.png) +![Analog](../assets/16_1.png) Он заключается в том, что световой поток, проходя сквозь линзы объектива, попадает на матрицу ПЗС, где он преобразуется в видеосигнал. Рынок аналоговых видеокамер обширный, и каждый из нас сможет сделать оптимальный для себя выбор, в соответствии с необходимыми характеристиками и вкусом. Большим преимуществом камер аналогового типа является их взаимосовместимость, даже от разных производителей, а также простота монтажа и настройки через соответствующие меню. ### Работа цифровых камер -![analogCam](../img/16_2.png) +![analogCam](../assets/16_2.png) Цифровые видеокамеры (IP камеры), вошли в нашу жизнь совсем недавно, но с позиций их использования – на практике зарекомендовали себя достаточно хорошо с позиций существенного улучшения качества. Конечно же, они пока что, немного дороговаты по сравнению с камерами аналогового типа, но в перспективе развития цифровых технологий – альтернативы им нет. @@ -61,11 +61,11 @@ Летать можно 2-мя способами. С помощью монитора или в очках. -![resolution](../img/16_3.png) +![resolution](../assets/16_3.png) Современный рабочий вариант очков имеет разрешение 800x600, чего более чем достаточно. -![camera](../img/16_4.png) +![camera](../assets/16_4.png) Даже на отличной камере детализация низковата. Атмосферу не чувствуешь, и какие-то шумы присутствуют. Насладиться красотой пейзажей можно потом, в записи со второй цифровой HD-камеры, а не в процессе полета. diff --git a/docs/les2.md b/docs/les2.md index 439a730e..947160d5 100644 --- a/docs/les2.md +++ b/docs/les2.md @@ -12,7 +12,7 @@ Так вот, эта разница потенциалов (+) и (-), есть электродвижущая сила (далее ЭДС), то есть электрическое напряжение. -![current](../img/2_1.png) +![current](../assets/2_1.png) Итак, источник электроэнергии обладает разностью потенциалов, заряженные частицы которых, стремятся друг к другу. А так - же есть такие, которые ограничивают их движение. @@ -28,12 +28,12 @@ Электрический ток будет равен тому, что мы получим, когда поделим разность потенциалов участка (величина напряжения) на сопротивляемость этого участка (сопротивление). Обозначаем: I - электрический ток; U - напряжение; R - сопротивление; -![current](../img/2_2.png) +![current](../assets/2_2.png) С помощью треугольника, работая с формулой закона Ома, легко написать формулу для любой входящей величины. -![current](../img/2_3.png) +![current](../assets/2_3.png) Нужно закрыть ту величину, которую необходимо определить. Если две оставшиеся величины находятся на одном уровне – значит надо их перемножить. @@ -73,12 +73,12 @@ I=2 A **I = I1+I2+I3+I4;** -![current](../img/2_4.png) +![current](../assets/2_4.png) Cумма токов, подходящих к узловой точке электрической цепи, равна сумме токов, уходящих от этого узла. -![current](../img/2_5.png) +![current](../assets/2_5.png) При параллельном соединении резисторов ток проходит по четырем направлениям, что уменьшает общее сопротивление или увеличивает общую проводимость цепи, которая равна сумме проводимостей ветвей. @@ -107,7 +107,7 @@ Cумма токов, подходящих к узловой точке элек Из этого равенства найдем сопротивление R, которым можно заменить два параллельно соединенных резистора: -![current](../img/2_6.png) +![current](../assets/2_6.png) Полученное выражение имеет большое практическое применение. Благодаря этому закону производятся расчёты электрических цепей. @@ -131,7 +131,7 @@ Cумма токов, подходящих к узловой точке элек **Е = Е1—Е2.** -![current](../img/2_7.png) +![current](../assets/2_7.png) Закон Джоуля-Ленца ------------------ @@ -151,11 +151,11 @@ Cумма токов, подходящих к узловой точке элек Если обозначить количество теплоты, создаваемое током, буквой Q (Дж), ток, протекающий по проводнику - I, сопротивление проводника - R и время, в течение которого ток протекал по проводнику - t, то закону Ленца-Джоуля можно придать следующее выражение: -![current](../img/2_8.png) +![current](../assets/2_8.png) Решим пример задачи: -![current](../img/2_9.png) +![current](../assets/2_9.png) ### Контрольные вопросы: 1) Что такое электродвижущая сила? diff --git a/docs/les4.md b/docs/les4.md index 6a7473fc..5163a94d 100644 --- a/docs/les4.md +++ b/docs/les4.md @@ -23,7 +23,7 @@ Для следующих операций понадобится уже специальный электронагревательный инструмент: паяльник, футорка или паяльная горелка. Паять в домашних условиях чаще всего приходится электропаяльником с медным луженым жалом. -![scheme](../img/4_1.png) +![scheme](../assets/4_1.png) Лудить необходимо следующим образом: @@ -54,7 +54,7 @@ * Простая последовательная скрутка, т. наз. прямая британская, или просто британка, применима для соединения токоведущих проводов гибких кабелей сечением до 1,4 кв. мм, не испытывающих регулярных больших механических нагрузок, напр. электрических удлинителей или времянок. -![scheme](../img/4_2.png) +![scheme](../assets/4_2.png) Электрические провода, испытывающие регулярные и/или постоянные механические нагрузки, должны быть обязательно многожильными. Скручивают их, как показано внизу на рис: концы разметливают, «метлы» вдвигают друг в друга и скручивают по-британски. Паяют легкоплавким припоем повышенной прочности, напр. ПОСК-50 (см. ниже) с активированным флюсом, не требующим удаления остатков, также см. ниже. Параллельные (тупиковые) скрутки проводов сечением свыше 0,7 кв. мм желательно паять погружением в расплавленный припой, см. далее. В противном случае придется греть или долго, или слишком мощным паяльником, отчего изоляция ползет, а флюс преждевременно выкипает. @@ -77,7 +77,7 @@ Второе – хлористый цинк в активированных флюс-пастах часто заменяют тераборнокислым натрием – бурой. Соляная кислота – высокотоксичное химически агрессивное летучее вещество; хлорид цинка также токсичен, а при нагреве сублимирует, т.е. улетучивается не плавясь. Бура безопасна, но при нагреве выделяет большое количество кристаллизационной воды, что немного ухудшает качество пайки. -![flux](../img/4_3.png) +![flux](../assets/4_3.png) Пайки от СКФ нужно обязательно промывать: в состав канифоли входит янтарная кислота, при длительном контакте разрушающая металл. Кроме того, случайно пролитый СКФ мгновенно растекается по большой площади и превращается в очень долго сохнущую чрезвычайно липкую гадость, пятна от которой ничем не сводятся ни с одежды, ни с мебели, ни с пола со стенами. В общем СКФ для пайки хороший флюс, но не для ротозеев с растяпами. Полноценный заменитель СКФ, но не такой противный при небрежном обращении – флюс ТАГС. Стальные детали более массивные, чем допустимо для пайки паяльной кислотой, и более прочно, паяют флюсом Ф38. Универсальным флюсом можно паять практически любые металлы в любых сочетаниях, в т.ч. алюминий, но прочность спая с ним не нормируется. К пайке алюминия мы еще вернемся. @@ -85,7 +85,7 @@ Любители мастерить также часто паяют сухим паяльником с бронзовым нелуженым жалом, т. наз. паяльным карандашом, поз. 1 на рис. Он хорош там, где недопустимо растекание припоя вне зоны пайки: в ювелирных изделиях, витражах, паяных предметах прикладного искусства. Иногда всухую паяют и микрочипы, монтируемые на поверхность, с шагом расположения выводов 1,25 или 0,625 мм, но это дело рискованное и для опытных специалистов: плохой тепловой контакт требует избыточной мощности паяльника и длительного нагрева, а обеспечить стабильность прогрева при ручной пайке невозможно. Для сухой пайки применяют гарпиус из ПОСК-40, 45 или 50 и флюс-пасты, не требующие удаления остатков. -![scheme](../img/4_4.png) +![scheme](../assets/4_4.png) ### Мелкая пайка @@ -102,7 +102,7 @@ эффект: спихнул нечаянно плату-«каракатицу» на пол – 1-2 или более дорожек отслоились. Не дожидаясь и первой перепайки. -![soldering](../img/4_5.png) +![soldering](../assets/4_5.png) Паечные наплывы на печатных платах должны быть округлыми гладкими высотой не более 0,7 диаметра монтажной площадки, см. справа на рис. Кончики выводов должны немного выступать из наплывов. Кстати, плата полностью самодельная. Есть способ в домашних условиях сделать печатный монтаж таким же точным и четким, как фабричный, да еще и вывести там надписи, какие хочется. Белые пятнышки – блики от лака при фотосъемке. Наплывы вогнутые и тем более сморщенные – тоже брак. Просто вогнутый наплыв значит, что припоя недостаточно, а морщинистый, кроме того, что в пайку проник воздух. Если собранное устройство не работает и есть подозрение на непропай, смотрите в первую очередь такие места. @@ -114,7 +114,7 @@ Ах да, подставки для паяльников. Классическая, слева на рис., пригодна для любых стержневых. Где на ней быть ванночкам для припоя и канифоли – дело ваше, какой-либо регламентации нет. Для маломощных паяльников с фартуком пригодны упрощенные подставки-скобы, в центре. -![soldering](../img/4_6.png) +![soldering](../assets/4_6.png) Паяльные станции комплектуются преимущественно пружинными или трубчатыми ложементами-гнездами для паяльников. В них вся горячая часть инструмента недоступна для прикосновения, но и промазать паяльником мимо них, сосредоточившись на пайке мелкой «россыпи», вероятнее. Но чего уж точно не надо делать, и что прямо запрещено ТБ – это подставку из подручных материалов, в которой паяльник лежит на ванночках для расходных материалов, справа на рис. diff --git a/docs/les7.md b/docs/les7.md index e982f388..4d81a373 100644 --- a/docs/les7.md +++ b/docs/les7.md @@ -8,12 +8,12 @@ Винт вращается на месте. При этом масса воздуха перемещается вертикально сверху вниз. Это один из режимов так называемого осевого обдува винта. На одной из лопастей выделены два небольших участка: один – «А» – ближе к оси вращения, другой – «Б» – у конца лопасти. В процессе вращения винта оба участка будут описывать концентрические окружности. Понятно, что длина окружности, описываемой элементом «Б», а значит, и его скорость относительно воздуха, будет больше, чем элемента «А». Иными словами, скорость элемента лопасти относительно воздуха зависит от того, на каком расстоянии он расположен от оси вращения. Чем это расстояние больше, тем большую скорость имеет элемент. Понятно, что на оси вращения скорость будет равна нулю, а на конце лопасти она будет наибольшей. -![rotation](../img/7_1.png) +![rotation](../assets/7_1.png) Поперечное сечение лопасти на этом участке имеет вид обтекаемого профиля. При обтекании этого профиля потоком воздуха под углом атаки возникают подъемная сила Y и сила сопротивления X, которые вычисляются по специальным формулам. Разбивая лопасть на множество мелких участков можно определить их подъемные силы и силы сопротивления, и, сложив вместе соответствующие силы по всем участкам, определить подъемную силу и силу лобового сопротивления одной лопасти. (С математической точки зрения такая операция именуется интегрированием по размаху лопасти). Подъемная сила (или сила тяги) всего винта получается умножением подъемной силы одной лопасти на число лопастей. Концевой эффект. Величина силы тяги винта определяется описанным выше методом с некоторой ошибкой, обусловленной несколькими причинами. Одна их них состоит в не учете явления так называемого концевого эффекта. Концевой эффект проявляется в стремлении воздуха к выравниванию давлений над лопастью и под лопастью путем перетекания через края лопасти. -![rotation](../img/7_2.png) +![rotation](../assets/7_2.png) В данном случае перетекание происходит как на внешнем, так и на внутреннем краях лопасти. А так как подъемная сила появляется вследствие разности давлений на верхней и нижней поверхностях лопасти, то любое выравнивание этих давлений вызывает потери подъемной силы. @@ -32,7 +32,7 @@ Для постройки квадрокоптера нужно две пары разнонаправленных винтов, для гексакоптера – три пары и т.д. -![rotation](../img/7_3.png) +![rotation](../assets/7_3.png) 5. **Направление вращения винтов** - классическое - против часовой стрелки 2 винта, по часовой стрелке другие 2 винта на квадрокоптерах. 6. **Качество изготовления пропеллеров** тоже важно. На практике это означает, что обязательно нужно балансировать пропеллеры, чтобы минимизировать вибрацию, которая разрушает механические части (постепенно), а также сводит с ума гироскопы, ухудшая полетные свойства мультикоптера. @@ -58,7 +58,7 @@ Для примера возьмем мотор X2204S 2300kv компании SunnySky. Заходим на сайт производителя и находим наш мотор. В описании имеется табличка, с помощью которой можно подобрать пропеллер (prop). -![rotation](../img/7_4.png) +![rotation](../assets/7_4.png) ### Контрольные вопросы diff --git a/docs/les8.md b/docs/les8.md index 30a90f54..cb374628 100644 --- a/docs/les8.md +++ b/docs/les8.md @@ -8,7 +8,7 @@ **Зако́н Ампе́ра** — закон взаимодействия электрических токов. Впервые был установлен Андре Мари Ампером в 1820 для постоянного тока. Из закона Ампера следует, что параллельные проводники с электрическими токами, текущими в одном направлении, притягиваются, а в противоположных — отталкиваются. -![low](../img/8_1.png) +![low](../assets/8_1.png) Закон Ома --------- @@ -26,13 +26,13 @@ Каждый электродвигатель обладает некоторыми отличительными свойствами, которые обуславливают его область применения, в которой он наиболее выгоден. Синхронные, асинхронные, постоянного тока, коллекторные, бесколлекторные, вентильно-индукторные, шаговые… -![engine](../img/8_2.png) +![engine](../assets/8_2.png) ### Двигатель постоянного тока (ДПТ) Именно этот тип двигателя стоит в большинстве старых игрушек. Батарейка, два проводка на контакты. Внутри такого двигателя на валу установлен контактный узел – коллектор, переключающий обмотки на роторе в зависимости от положения ротора. Постоянный ток, подводимый к двигателю, протекает то по одним, то по другим частям обмотки, создавая вращающий момент. -![engine](../img/8_3.png) +![engine](../assets/8_3.png) Двигатели постоянного тока бывают как очень маленького размера («вибра» в телефоне), так и довольно большого – обычно до мегаватта. Например, на фото ниже показан тяговый электродвигатель электровоза мощностью 810кВт и напряжением 1500В. @@ -40,7 +40,7 @@ Как ни странно, это самый распространенный в быту электродвигатель, название которого наименее известно. Почему так получилось? Его конструкция и характеристики такие же, как у двигателя постоянного тока, поэтому упоминание о нем в учебниках по приводу обычно помещается в самый конец главы. -![engine](../img/8_4.png) +![engine](../assets/8_4.png) Этот тип двигателей наиболее широко распространен в бытовой технике, где требуется регулировать частоту вращения: дрели, стиральные машины (не с «прямым приводом»), пылесосы и т.п. Почему именно он так популярен? Из-за простоты регулирования. Как и в ДПТ, его можно регулировать уровнем напряжения, что для сети переменного тока делается симистором (двунаправленным тиристором). Схема регулирования может быть так проста, что помещается, например, прямо в «курке» электроинструмента и не требует ни микроконтроллера, ни ШИМ, ни датчика положения ротора. @@ -52,14 +52,14 @@ Синхронных приводов бывает несколько подвидов – с магнитами (PMSM) и без (с обмоткой возбуждения и контактными кольцами), с синусоидальной ЭДС или с трапецеидальной (бесколлекторные двигатели постоянного тока, BLDC). Сюда же можно отнести некоторые шаговые двигатели. До эры силовой полупроводниковой электроники уделом синхронных машин было применение в качестве генераторов (почти все генераторы всех электростанций – синхронные машины), а также в качестве мощных приводов для какой-либо серьезной нагрузки в промышленности. -![engine](../img/8_5.png) +![engine](../assets/8_5.png) ### Сравнение коллекторного и бесколлекторного двигателя У радиоуправляемых моделей с электродвигателями бывают коллекторные и бесколлекторные двигатели. Краткое сравнение типов двигателей: коллекторные развивают меньшую скорость. Бесколлекторные двигатели способны развить большую скорость, а также более износостойкие. -![engine](../img/8_6.png) +![engine](../assets/8_6.png) ### Коллекторный двигатель diff --git a/docs/les9.md b/docs/les9.md index 89e61dd9..cfddf1d1 100644 --- a/docs/les9.md +++ b/docs/les9.md @@ -25,13 +25,13 @@ Трехфазные бесколлекторные двигатели приобрели наибольшее распространение. Но они могут быть и одно, двух, трех и более фазными. Чем больше фаз, тем более плавное вращение магнитного поля, но и сложнее система управления двигателем. 3-х фазная система наиболее оптимальна по соотношению эффективность/сложность, поэтому и получила столь широкое распространение. Далее будет рассматриваться только трехфазная схема, как наиболее распространенная. Фактически фазы – это обмотки двигателя. Поэтому если сказать “трехобмоточный”, думаю, это тоже будет правильно. Три обмотки соединяются по схеме “звезда” или “треугольник”. Трехфазный бесколлекторный двигатель имеет три провода – выводы обмоток. -![winding](../img/9_1.png) +![winding](../assets/9_1.png) Двигатели с датчиками имеют дополнительных 5 проводов (2-питание датчиков положения, и 3 сигналы от датчиков). В трехфазной системе в каждый момент времени напряжение подается на две из трех обмоток. Таким образом, есть 6 вариантов подачи постоянного напряжения на обмотки двигателя, как показано на рисунке ниже. -![engine](../img/9_2.png) +![engine](../assets/9_2.png) Это позволяет создать вращающееся магнитное поле, которое будет проворачиваться “шагами” на 60 градусов при каждом переключении. diff --git a/docs/modes.md b/docs/modes.md index 4fb8588b..7219b89e 100644 --- a/docs/modes.md +++ b/docs/modes.md @@ -45,4 +45,4 @@ PX4 * [SET_POSITION_TARGET_LOCAL_NED](https://pixhawk.ethz.ch/mavlink/#SET_POSITION_TARGET_LOCAL_NED) * [SET_ATTITUDE_TARGET](https://pixhawk.ethz.ch/mavlink/#SET_ATTITUDE_TARGET) -См.: [автономные полеты коптера в режиме OFFBOARD](simple_offboard.md). \ No newline at end of file +См.: [автономные полеты коптера в режиме OFFBOARD](simple_offboard.md). diff --git a/docs/radioerrors.md b/docs/radioerrors.md index 0d1519e3..9f9bbc74 100644 --- a/docs/radioerrors.md +++ b/docs/radioerrors.md @@ -12,7 +12,7 @@ 2. Переключатели A, B, C, D (2) в положение “От Себя”. 3. Правый стик (3) в центре. -![Заблокированный пульт](../img/lockradio.jpg) +![Заблокированный пульт](../assets/lockradio.jpg) Нет связи с приемником @@ -21,11 +21,11 @@ 1. Соединение с приемником отсутствует -![Нет соединения с приемником](../img/connectionLost.jpg) +![Нет соединения с приемником](../assets/connectionLost.jpg) 2. Соединение с приемником установлено -![Есть соединения с приемником](../img/connectionOK.jpg) +![Есть соединения с приемником](../assets/connectionOK.jpg) Если соединение отсутствует, то 1. Проверьте, что приемник включен (моргает красный светодиод) @@ -37,7 +37,7 @@ -------------- Если нет связи с полетным контроллером, то на экране монитора компьютера в окне Channel Monitor не будут отображаться изменения положения слайдеров при перемещении стиками пульта. -![Нет связи с полетным контроллером](../img/notmoveslider.jpg) +![Нет связи с полетным контроллером](../assets/notmoveslider.jpg) 1. Зайдите в МЕНЮ (удерживаем нажатой кнопку “ОК”) 2. Выберите меню “System setup” (Кнопки Up/Down - для навигации, кнопка “ОК” - подтверждение выбора diff --git a/docs/radioerrors1.md b/docs/radioerrors1.md index 0d1519e3..9f9bbc74 100644 --- a/docs/radioerrors1.md +++ b/docs/radioerrors1.md @@ -12,7 +12,7 @@ 2. Переключатели A, B, C, D (2) в положение “От Себя”. 3. Правый стик (3) в центре. -![Заблокированный пульт](../img/lockradio.jpg) +![Заблокированный пульт](../assets/lockradio.jpg) Нет связи с приемником @@ -21,11 +21,11 @@ 1. Соединение с приемником отсутствует -![Нет соединения с приемником](../img/connectionLost.jpg) +![Нет соединения с приемником](../assets/connectionLost.jpg) 2. Соединение с приемником установлено -![Есть соединения с приемником](../img/connectionOK.jpg) +![Есть соединения с приемником](../assets/connectionOK.jpg) Если соединение отсутствует, то 1. Проверьте, что приемник включен (моргает красный светодиод) @@ -37,7 +37,7 @@ -------------- Если нет связи с полетным контроллером, то на экране монитора компьютера в окне Channel Monitor не будут отображаться изменения положения слайдеров при перемещении стиками пульта. -![Нет связи с полетным контроллером](../img/notmoveslider.jpg) +![Нет связи с полетным контроллером](../assets/notmoveslider.jpg) 1. Зайдите в МЕНЮ (удерживаем нажатой кнопку “ОК”) 2. Выберите меню “System setup” (Кнопки Up/Down - для навигации, кнопка “ОК” - подтверждение выбора diff --git a/docs/safety.md b/docs/safety.md index 1250269e..9d6b5e2b 100644 --- a/docs/safety.md +++ b/docs/safety.md @@ -30,7 +30,7 @@ Паяльник можно держать только за ручку. Если кто-то утверждает обратное — не верьте, вас вводят в заблуждение :) -![Паяльник состав](../img/solderConsist.jpg) +![Паяльник состав](../assets/solderConsist.jpg) ![Подробнее...->](../docs/tb.md) diff --git a/docs/setup.md b/docs/setup.md index 2fac8777..911f22c5 100644 --- a/docs/setup.md +++ b/docs/setup.md @@ -3,7 +3,7 @@ ### 1. Состав пульта FLYSKY i6 --------------------- -![Состав пульта](../img/consistofTransmitter.jpg) +![Состав пульта](../assets/consistofTransmitter.jpg) ### 2. Установка QGroundCongtrol @@ -20,7 +20,7 @@ ### 4. Обновление прошивки Pixhawk -![Обновление прошивки](../img/firmwarePX4.jpg) +![Обновление прошивки](../assets/firmwarePX4.jpg) 1. Заходим в Vehicle Setup. 2. Выбираем Firmware. @@ -33,7 +33,7 @@ ### 5. Настройка Pixhawk -![Главное окно](../img/mainWindow.jpg) +![Главное окно](../assets/mainWindow.jpg) 1. Системы, нуждающиеся в настройке: Airframe, Radio, Sensors, Flight Mode 2. Текущая прошивка контроллера. @@ -42,14 +42,14 @@ ### 6. Выбор рамы -![ Выбор рамы](../img/airframeSetup.jpg) +![ Выбор рамы](../assets/airframeSetup.jpg) 1. Заходим в меню Airframe. 2. Выбираем тип рамы Quadrotor X. 3. Выбираем тип навесных элементов Generic Quadrotor X config 4. Перемещаемся в начало списка и сохраняем настройки Apply and Restart -![Внимание!](../img/attentionSave.jpg) +![Внимание!](../assets/attentionSave.jpg) 5. Повторно подтверждаем Apply 6. Ждем, пока Pixhawk выполнит сохранение и перезагрузится @@ -65,7 +65,7 @@ 3. Далее необходимо убедиться, что связь с приемником установлена: * На ЖК Экране пульта высвечивается индикация - ![ Индикация пульта](../img/unblockView.jpg) + ![ Индикация пульта](../assets/unblockView.jpg) * Светодиод на приемнике горит непрерывно красным @@ -78,7 +78,7 @@ На канал CH5 назначаем 3-х позиционный переключатель SwC - будем изменять полетные режимы На канал CH6 назначаем 2-х позиционный переключатель SwA - аварийная остановка моторов -![Используемые переключатели](../img/chooseSwitch.jpg) +![Используемые переключатели](../assets/chooseSwitch.jpg) #### Чтобы переназначить переключатели, выполните следующие действия: @@ -90,7 +90,7 @@ * Channel 6 - SwA 5. Сохраните изменения (удерживаем нажатой кнопку “CANCEL”) -![Выбор каналов](../img/setupSwitch.jpg) +![Выбор каналов](../assets/setupSwitch.jpg) ### 9. Калибровка пульта @@ -102,7 +102,7 @@ * Чтобы установить один из триммеров в 0, необходимо на пульте переместить указатель в центр до длительного звукового сигнала (писка) 3. Жмем ОК -![Калибровка пульта Начало](../img/calibrateViewStart.jpg) +![Калибровка пульта Начало](../assets/calibrateViewStart.jpg) 4. Переводим Левый стик (газ) (throttle) в минимум и кликаем Next 5. Калибровка каналов управления (throttle, yaw, pitch, roll). @@ -116,7 +116,7 @@ 8. Калибровка пульта завершена! -![Калибровка пульта](../img/calibrateView.jpg) +![Калибровка пульта](../assets/calibrateView.jpg) ### 10. Калибровка акселерометра @@ -125,12 +125,12 @@ 2. Поскольку направление Pixhawk совпадает с носом БПЛА, то выбираем Autopilot Orientation: ROTATION_NONE Кликаем OK - ![Калибровка акселерометра](../img/calibrateaxcelstart.jpg) + ![Калибровка акселерометра](../assets/calibrateaxcelstart.jpg) 3. Начинаем калибровку: Последовательно располагаем БПЛА как на картинках, когда Pixhawk захватит положение, вокруг картинки появится желтая рамка - удерживаем в этом положении БПЛА до переключения в зеленую рамку - ![Калибровка акселерометра процесс](../img/calibrateaxcel.jpg) + ![Калибровка акселерометра процесс](../assets/calibrateaxcel.jpg) ### 11. Калибровка компаса @@ -142,7 +142,7 @@ * Выбираем ориентацию БПЛА как на картинке и ждем, когда Pixhawk определит положение БПЛА, появится желтая рамка и надпись "Rotate" * Вращаем БПЛА как на картинке до появления зеленой рамки - Pixhawk откалибровал компас по данной оси. -![Калибровка компаса](../img/calibratecompass.jpg) +![Калибровка компаса](../assets/calibratecompass.jpg) ### 12. Калибровка гироскопа @@ -151,7 +151,7 @@ 2. Устанавливаем БПЛА на ровную поверхность и кликаем OK Ждем окончания калибровки. -![Калибровка компаса](../img/calibrategyro.jpg) +![Калибровка компаса](../assets/calibrategyro.jpg) ##### Во время калибровки БПЛА не должен менять своего положения, шататься и т.д. @@ -170,7 +170,7 @@ 6. Аварийное отключение моторов ставим на переключатель SwA (Channel 6). Kill switch - Channel 6 -![Полетные режимы](../img/flightModes.jpg) +![Полетные режимы](../assets/flightModes.jpg) ### 14. Отключение Safety Switch @@ -183,7 +183,7 @@ 3. Сохраняем значения, кликая по кнопке Save 4. Повторяем установку максимальных значений для всех параметров, кроме CBRK_RATE_CTRL и CBRK_VELPOSERR -![Отключение кнопки безопасности](../img/turnoffSafetyswitch.jpg) +![Отключение кнопки безопасности](../assets/turnoffSafetyswitch.jpg) ### 15. Калибровка регуляторов @@ -199,7 +199,7 @@ 4. Проверяем, что АКБ не подключена и пропеллеры сняты Нажимаем Calibrate -![Калибровка регуляторов](../img/calibrateESC.jpg) +![Калибровка регуляторов](../assets/calibrateESC.jpg) ### 16. Настройка PID - регулятора @@ -218,7 +218,7 @@ * MC_ROLLRATE_I: 0.050 * MC_ROLLRATE_D: 0.0025 -![Коэффициенты ПИД-регулятора](../img/calibratePIDparams.jpg) +![Коэффициенты ПИД-регулятора](../assets/calibratePIDparams.jpg) ## ИНСТРУКЦИЯ ПО БЕЗОПАСНОСТИ diff --git a/docs/simple_offboard.md b/docs/simple_offboard.md index df77de15..689d26dc 100644 --- a/docs/simple_offboard.md +++ b/docs/simple_offboard.md @@ -253,4 +253,4 @@ set_mode = rospy.ServiceProxy('/mavros/set_mode', SetMode) # объявляем set_mode(base_mode=0, custom_mode='AUTO.LAND') # включаем режим посадки ``` -Для полетов в поле ArUco-макеров см. [навигация по ArUco](/docs/aruco.md). \ No newline at end of file +Для полетов в поле ArUco-макеров см. [навигация по ArUco](/docs/aruco.md). diff --git a/docs/tb.md b/docs/tb.md index 16d9e3c5..ea83326e 100644 --- a/docs/tb.md +++ b/docs/tb.md @@ -7,16 +7,16 @@ 1. Привести в порядок рабочее место, ничего не должно мешать процессу. Рабочее место должно быть хорошо освещено. 2. Паяльник, находящийся в рабочем состоянии, установить в зоне действия местной вытяжной вентиляции, в специальную подставку. -![stand](/img/stand.jpg) +![stand](/assets/stand.jpg) Во время пайки: 1. Паяльник следует держать только за ручку, так как жало имеет высокую температуру. -![keep](/img/keep.png) +![keep](/assets/keep.png) 2. Для перемещения изделий применять специальные инструменты (пинцеты, клещи или другие инструменты), обеспечивающие безопасность при пайке. 3. Во избежание ожогов расплавленным припоем при распайке не выдергивать резко с большим усилием паяемые провода. 4. При пайке мелких и подвижных изделий пользоваться специальным держателем. -![helphand](/img/helphand.jpg) +![helphand](/assets/helphand.jpg) 5. Паяльник переносить за корпус, а не за провод или рабочую часть. При перерывах в работе паяльник отключать от электросети. **При обнаружении неисправной работы паяльника или возникновении возгорания отключить его от питающей электросети.** diff --git a/docs/wifi.md b/docs/wifi.md index fa68b1e4..2cd8f987 100644 --- a/docs/wifi.md +++ b/docs/wifi.md @@ -5,4 +5,4 @@ Пароль: `cleverwifi`. -TODO: иллюстрация. \ No newline at end of file +TODO: иллюстрация. diff --git a/notes/deck.md b/notes/deck.md index 2b79739f..5f5a62d6 100644 --- a/notes/deck.md +++ b/notes/deck.md @@ -2,4 +2,4 @@ Они абсолютно одинаковые. Поэтому для дальнейшего удобства понимания инструкции условно разделим их на верхнюю и нижнюю дополнительные рамы -![Общая раскладка](../img/allElements.png) +![Общая раскладка](../assets/allElements.png) diff --git a/notes/powerConnection.md b/notes/powerConnection.md index 814407db..2e41c467 100644 --- a/notes/powerConnection.md +++ b/notes/powerConnection.md @@ -11,7 +11,7 @@ Говоря простым языком, силовые цепи - это электрические цепи, которые предназначены для передачи большого количества энергии (тока), для обеспечения работоспособности всех систем. В нашем случае в качестве силовой цепи будут выступать провода, соединяющие аккумулятор с платой распределения питания, а также красные и черные провода идущие на регуляторы оборотов. -![Схема силовой цепи](../img/powerConnect.jpg) +![Схема силовой цепи](../assets/powerConnect.jpg) Вся энергия аккумулятора (АКБ) будет распределяться между регуляторами оборотов моторов. Чтобы моторы смогли поднять в воздух коптер, им необходимо много энергии. В качестве энергии выступает ток, который приходит с АКБ. Т.к. энергии нужно много, значит по проводам будет идти большой ток. Чтобы провода смогли выдержать такую нагрузку, необходимы провода большего диаметра. Для наших задач подойдут провода 18AWG, 16AWG, 14AWG. diff --git a/notes/testConnection.md b/notes/testConnection.md index a041a8f0..5e131548 100644 --- a/notes/testConnection.md +++ b/notes/testConnection.md @@ -12,7 +12,7 @@ * Проверить работу мультиметра путем замыкания щупов между собой. При корректной работе прибор издаст характерный звук. * Попарно красный щуп прикладывается к “+ ”контакту, черный к “-” / ”GND”. Если в цепи есть короткое замыкание, издается звук. -1[Режим прозвонки](../img/startPDBtest.jpg) +1[Режим прозвонки](../assets/startPDBtest.jpg) 1. Прозвонить следующие цепи на НЕЗАМКНУТОСТЬ (отсутствие звукового сигнала мультиметра): diff --git a/notes/zap.md b/notes/zap.md index 949920ba..61df30a9 100644 --- a/notes/zap.md +++ b/notes/zap.md @@ -10,7 +10,7 @@ 1. Нанести флюс на контактную площадку 2. Покрыть припоем контактную площадку -![Лужение площадок](../img/zapPDBtest.jpg) +![Лужение площадок](../assets/zapPDBtest.jpg) ## Лужение проводов @@ -22,4 +22,4 @@ 3. Нанести флюс на скрученные оголенные провода 4. Покрыть слоем припоя. -![Лужение проводов](../img/zap.jpg) +![Лужение проводов](../assets/zap.jpg) From 8e0fb01fb08c3b20786527586769d9af4599a109 Mon Sep 17 00:00:00 2001 From: urpylka Date: Mon, 5 Feb 2018 17:42:36 +0300 Subject: [PATCH 123/149] Move docs from 'notes' to 'docs' directory --- {notes => docs}/deck.md | 0 {notes => docs}/powerConnection.md | 0 {notes => docs}/testConnection.md | 0 {notes => docs}/zap.md | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename {notes => docs}/deck.md (100%) rename {notes => docs}/powerConnection.md (100%) rename {notes => docs}/testConnection.md (100%) rename {notes => docs}/zap.md (100%) diff --git a/notes/deck.md b/docs/deck.md similarity index 100% rename from notes/deck.md rename to docs/deck.md diff --git a/notes/powerConnection.md b/docs/powerConnection.md similarity index 100% rename from notes/powerConnection.md rename to docs/powerConnection.md diff --git a/notes/testConnection.md b/docs/testConnection.md similarity index 100% rename from notes/testConnection.md rename to docs/testConnection.md diff --git a/notes/zap.md b/docs/zap.md similarity index 100% rename from notes/zap.md rename to docs/zap.md From 5417b32b49ad15d430ba1787c5708c94a072ef9b Mon Sep 17 00:00:00 2001 From: urpylka Date: Mon, 5 Feb 2018 21:15:49 +0300 Subject: [PATCH 124/149] Remove README.md before merge --- README.md | 63 ------------------------------------------------------- 1 file changed, 63 deletions(-) delete mode 100644 README.md diff --git a/README.md b/README.md deleted file mode 100644 index 4fa3c0eb..00000000 --- a/README.md +++ /dev/null @@ -1,63 +0,0 @@ -# Clever - -Пакет программ и библиотек для Клевера. - -Основная документация ---------------------- - -https://copterexpress.gitbooks.io/clever/content/ - -**Готовый образ** для RPi 3 с предустановленным и преднастроенным clever_bundle можно скачать [здесь](https://copterexpress.gitbooks.io/clever/content/docs/microsd_images.html). - -[Описание API](https://copterexpress.gitbooks.io/clever/content/docs/simple_offboard.html) для автономных полетов. - -Установка ---------- - -Склонировать репозиторий в папку `/home/pi/catkin_ws/src/clever` (**важно**): - -```bash -cd ~/catkin_ws/src -git clone https://github.com/CopterExpress/clever_bundle.git clever -``` - -Пересобрать ROS-пакеты: - -```bash -cd ~/catkin_ws -catkin_make -j1 -``` - -Включить сервис roscore (если он не включен): - -```bash -sudo systemctl enable /home/pi/catkin_ws/src/clever/deploy/roscore.service -sudo systemctl start roscore -``` - -Включить сервис clever: - -```bash -sudo systemctl enable /home/pi/catkin_ws/src/clever/deploy/clever.service -sudo systemctl start clever -``` - -Зависимости ------------ - -[ROS Kinetic](http://wiki.ros.org/kinetic). - -Необходимые для работы ROS-пакеты: - -* `opencv3` -* `mavros` -* `rosbridge_suite` -* `web_video_server` -* `cv_camera` -* `nodelet` -* `dynamic_reconfigure` -* `bondcpp`, ветка `master` -* `roslint` -* `rosserial` - -TODO: внести в package.xml From c2c82cef80e1387ae203a9e46e7d3e23ee92e222 Mon Sep 17 00:00:00 2001 From: Smirnov Artem Date: Tue, 6 Feb 2018 19:43:14 +0300 Subject: [PATCH 125/149] Merge README.md from clever & clever_bundle --- README.md | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 32784f3b..de835b64 100644 --- a/README.md +++ b/README.md @@ -11,4 +11,62 @@ Для того, чтобы научиться собирать, настраивать, пилотировать и программировать автономный дрон «Клевер», воспользуйтесь этим учебником. -Оглавление находится в файле [SUMMARY.md](/SUMMARY.md). +Основная документация +--------------------- + +https://copterexpress.gitbooks.io/clever/content/ + +**Готовый образ** для RPi 3 с предустановленным и преднастроенным clever_bundle можно скачать [здесь](https://copterexpress.gitbooks.io/clever/content/docs/microsd_images.html). + +[Описание API](https://copterexpress.gitbooks.io/clever/content/docs/simple_offboard.html) для автономных полетов. + +Установка +--------- + +Склонировать репозиторий в папку `/home/pi/catkin_ws/src/clever` (**важно**): + +```bash +cd ~/catkin_ws/src +git clone https://github.com/CopterExpress/clever_bundle.git clever +``` + +Пересобрать ROS-пакеты: + +```bash +cd ~/catkin_ws +catkin_make -j1 +``` + +Включить сервис roscore (если он не включен): + +```bash +sudo systemctl enable /home/pi/catkin_ws/src/clever/deploy/roscore.service +sudo systemctl start roscore +``` + +Включить сервис clever: + +```bash +sudo systemctl enable /home/pi/catkin_ws/src/clever/deploy/clever.service +sudo systemctl start clever +``` + +Зависимости +----------- + +[ROS Kinetic](http://wiki.ros.org/kinetic). + +Необходимые для работы ROS-пакеты: + +* `opencv3` +* `mavros` +* `rosbridge_suite` +* `web_video_server` +* `cv_camera` +* `nodelet` +* `dynamic_reconfigure` +* `bondcpp`, ветка `master` +* `roslint` +* `rosserial` + +TODO: внести в package.xml From 6e9664e2212680171b5a2df4ded3cb489f439af5 Mon Sep 17 00:00:00 2001 From: urpylka Date: Tue, 6 Feb 2018 21:24:41 +0300 Subject: [PATCH 126/149] Add image-make tools --- image/Jenkinsfile | 61 ++++++ image/apps.sh | 99 +++++++++ image/git_release.py | 38 ++++ image/iface.sh | 138 +++++++++++++ image/image-config.sh | 467 ++++++++++++++++++++++++++++++++++++++++++ image/ros.sh | 191 +++++++++++++++++ image/yadisk.py | 55 +++++ 7 files changed, 1049 insertions(+) create mode 100644 image/Jenkinsfile create mode 100755 image/apps.sh create mode 100755 image/git_release.py create mode 100755 image/iface.sh create mode 100755 image/image-config.sh create mode 100755 image/ros.sh create mode 100755 image/yadisk.py diff --git a/image/Jenkinsfile b/image/Jenkinsfile new file mode 100644 index 00000000..7ca842c2 --- /dev/null +++ b/image/Jenkinsfile @@ -0,0 +1,61 @@ +pipeline { + agent any + stages { + stage('Get image') { + agent any + environment { + RPI_DONWLOAD_URL = 'https://downloads.raspberrypi.org/raspbian_lite_latest' + RPI_ZIP_NAME = 'raspbian_lite_latest.zip' + RPI_IMAGE_NAME = '2017-11-29-raspbian-stretch-lite.img' + } + steps { + sh '$WORKSPACE/deploy/image-config.sh get_image $JENKINS_HOME $RPI_ZIP_NAME $RPI_DONWLOAD_URL $RPI_IMAGE_NAME $IMAGE_NAME' + } + } + stage('Resize FS') { + environment { + SIZE = '7G' + } + steps { + sh '$WORKSPACE/deploy/image-config.sh resize_fs $SIZE $JENKINS_HOME $IMAGE_NAME $DEV_ROOTFS' + } + } + stage('Configure interfaces') { + environment { + EXECUTE_FILE = 'iface.sh' + } + steps { + sh '$WORKSPACE/deploy/image-config.sh execute $JENKINS_HOME/$IMAGE_NAME $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $WORKSPACE/deploy/$EXECUTE_FILE' + } + } + stage('Install Apps') { + environment { + EXECUTE_FILE = 'apps.sh' + } + steps { + sh '# $WORKSPACE/deploy/image-config.sh execute $JENKINS_HOME/$IMAGE_NAME $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $WORKSPACE/deploy/$EXECUTE_FILE' + } + } + stage('Install ROS') { + environment { + EXECUTE_FILE = 'ros.sh' + } + steps { + sh '# $WORKSPACE/deploy/image-config.sh execute $JENKINS_HOME/$IMAGE_NAME $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $WORKSPACE/deploy/$EXECUTE_FILE' + } + } + stage('Publish image') { + environment { + CONFIG_FILE = 'coex-ci.conf' + } + steps { + sh '$WORKSPACE/deploy/image-config.sh publish_image $JENKINS_HOME $IMAGE_NAME $WORKSPACE $CONFIG_FILE $RELEASE_ID $RELEASE_BODY' + } + } + } + environment { + PREFIX_PATH = '/mnt' + DEV_BOOT = '/dev/disk/by-uuid/CDD4-B453' + DEV_ROOTFS = '/dev/disk/by-uuid/72bfc10d-73ec-4d9e-a54a-1cc507ee7ed2' + } +} diff --git a/image/apps.sh b/image/apps.sh new file mode 100755 index 00000000..459349dc --- /dev/null +++ b/image/apps.sh @@ -0,0 +1,99 @@ +#!/bin/bash + +################################################################################################################################## +# Установка необходимых программ +################################################################################################################################## + + +echo -e "\033[0;31m\033[1m$(date) | #1 apt update && apt upgrade\033[0m\033[0m" + +# install bootstrap tools +apt-get update +# && apt upgrade -y + + + +echo -e "\033[0;31m\033[1m$(date) | #2 Install programs\033[0m\033[0m" + +apt-get install --no-install-recommends -y \ + ipython \ + screen \ + byobu \ + nmap \ + lsof \ + python-pip \ + git \ + isc-dhcp-server \ + tmux + + + + + +echo -e "\033[0;31m\033[1m$(date) | #3 Write to /etc/wpa_supplicant/wpa_supplicant.conf\033[0m\033[0m" + +echo " +network={ + ssid=\"CLEVER\" + mode=2 + key_mgmt=WPA-PSK + psk=\"cleverwifi\" + frequency=2437 +}" >> /etc/wpa_supplicant/wpa_supplicant.conf + + + + + +echo -e "\033[0;31m\033[1m$(date) | #4 Write STATIC to /etc/dhcpcd.conf\033[0m\033[0m" + +echo " +interface wlan0 +static ip_address=192.168.11.1/24" >> /etc/dhcpcd.conf + + + + +echo -e "\033[0;31m\033[1m$(date) | #5 Write iface to /etc/default/isc-dhcp-server\033[0m\033[0m" + +# https://www.shellhacks.com/ru/sed-find-replace-string-in-file/ +sed -i 's/INTERFACESv4=\"\"/INTERFACESv4=\"wlan0\"/' /etc/default/isc-dhcp-server + + +echo -e "\033[0;31m\033[1m$(date) | #6 Write dhcp declaration subnet to /etc/dhcp/dhcpd.conf\033[0m\033[0m" + + +echo "subnet 192.168.11.0 netmask 255.255.255.0 { + range 192.168.11.11 192.168.11.254; + #option domain-name-servers 8.8.8.8; + #option domain-name "rpi.local"; + option routers 192.168.11.1; + option broadcast-address 192.168.11.255; + default-lease-time 600; + max-lease-time 7200; +}" >> /etc/dhcp/dhcpd.conf + + + +echo -e "\033[0;31m\033[1m$(date) | #7 Write start script for dhcpd to /etc/network/if-up.d/isc-dhcp-server\033[0m\033[0m" + +echo "#!/bin/sh +if [ \"\$IFACE\" = \"--all\" ]; +then sleep 10 && systemctl start isc-dhcp-server.service & +fi +" > /etc/network/if-up.d/isc-dhcp-server \ + && chmod +x /etc/network/if-up.d/isc-dhcp-server + + + +echo -e "\033[0;31m\033[1m$(date) | #8 Write magic script for rename SSID to /etc/rc.local\033[0m\033[0m" + +RENAME_SSID="sudo sed -i.OLD \"s/CLEVER/CLEVER-\$(head -c 100 /dev/urandom | xxd -ps -c 100 | sed -e 's/[^0-9]//g' | cut -c 1-4)/g\" /etc/wpa_supplicant/wpa_supplicant.conf && sudo sed -i '/sudo sed/d' /etc/rc.local && sudo reboot" + + +sed -i "19a$RENAME_SSID" /etc/rc.local + + + +echo -e "\033[0;31m\033[1m$(date) | #9 End of install programs\033[0m\033[0m" + diff --git a/image/git_release.py b/image/git_release.py new file mode 100755 index 00000000..e434aba5 --- /dev/null +++ b/image/git_release.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python + +# +# Simple github release body-editor +# Smirnov Artem @urpylka +# +# Use: +# python git_release.py CONFIG_FILE RELEASE_ID RELEASE_BODY +# + + +from ConfigParser import SafeConfigParser +import requests, sys, urllib + +def json_wrapper(image_name, image_link, image_size, old_text): + old_text = urllib.unquote_plus(old_text) + buffer = "### Download\n* [" + image_name + ".zip](" + image_link + ") (" + image_size + ")\n\n" + old_text + js = {} + js["body"] = buffer + return js + + +def main(): + + cfgParser = SafeConfigParser() + cfgParser.read(sys.argv[1]) + + js = json_wrapper(sys.argv[4], sys.argv[5], sys.argv[6], sys.argv[3]) + + r = requests.patch(cfgParser.get('github','url') + sys.argv[2], json=js, auth=(cfgParser.get('github','login'), cfgParser.get('github','password'))) + + if r.status_code == 200: + print("Message has been successfully added!") + else: + return 1 + +if __name__ == '__main__': + main() diff --git a/image/iface.sh b/image/iface.sh new file mode 100755 index 00000000..f4b1fb3b --- /dev/null +++ b/image/iface.sh @@ -0,0 +1,138 @@ +#!/bin/bash + +################################################################################################################################## +# Настройка интерфейсов +################################################################################################################################## + +# вот так все в принципе должно включиться +# /usr/bin/raspi-config nonint do_i2c 0 +# /usr/bin/raspi-config nonint do_spi 0 +# /usr/bin/raspi-config nonint do_camera 0 +# /usr/bin/raspi-config nonint do_rgpio 0 +# /usr/bin/raspi-config nonint do_ssh 0 + +# по идеи эти настройки должны проводиться до по другому как сделано в prepare_image.sh + +set_config_var() { + lua - "$1" "$2" "$3" < "$3.bak" +local key=assert(arg[1]) +local value=assert(arg[2]) +local fn=assert(arg[3]) +local file=assert(io.open(fn)) +local made_change=false +for line in file:lines() do + if line:match("^#?%s*"..key.."=.*$") then + line=key.."="..value + made_change=true + end + print(line) +end + +if not made_change then + print(key.."="..value) +end +EOF + mv "$3.bak" "$3" +} + +BLACKLIST=/etc/modprobe.d/raspi-blacklist.conf +CONFIG=/boot/config.txt + +# 2. Изменить необходимые настройки + +# 2.1. Включить sshd +echo -e "\033[0;31m\033[1m$(date) | #11 Turn on sshd\033[0m\033[0m" +touch /boot/ssh + +# 2.2. Включить GPIO +# Включено по умолчанию + +# 2.3. Включить I2C +echo -e "\033[0;31m\033[1m$(date) | #12 Turn on I2C\033[0m\033[0m" + +set_config_var dtparam=i2c_arm on $CONFIG && + if ! [ -e $BLACKLIST ]; then + touch $BLACKLIST + fi + sed $BLACKLIST -i -e "s/^\(blacklist[[:space:]]*i2c[-_]bcm2708\)/#\1/" + sed /etc/modules -i -e "s/^#[[:space:]]*\(i2c[-_]dev\)/\1/" + if ! grep -q "^i2c[-_]dev" /etc/modules; then + printf "i2c-dev\n" >> /etc/modules + fi + +# 2.4. Включить SPI +echo -e "\033[0;31m\033[1m$(date) | #13 Turn on SPI\033[0m\033[0m" + +set_config_var dtparam=spi on $CONFIG && + if ! [ -e $BLACKLIST ]; then + touch $BLACKLIST + fi + sed $BLACKLIST -i -e "s/^\(blacklist[[:space:]]*spi[-_]bcm2708\)/#\1/" + +# 2.5. Включить raspicam +echo -e "\033[0;31m\033[1m$(date) | #14 Turn on raspicam\033[0m\033[0m" + +get_config_var() { + lua - "$1" "$2" <> /etc/modules +if ! grep -q "^bcm2835-v4l2" /etc/modules; then + printf "bcm2835-v4l2\n" >> /etc/modules +fi + +# 2.6. Настроить AP wifi +# 2.7. Настроить сеть на wlan +# 2.8. Настроить DHCPd на wlan + + +echo -e "\033[0;31m\033[1m$(date) | #15 End of configuring interfaces\033[0m\033[0m" diff --git a/image/image-config.sh b/image/image-config.sh new file mode 100755 index 00000000..134a3d7d --- /dev/null +++ b/image/image-config.sh @@ -0,0 +1,467 @@ +#!/bin/bash +#!/bin/sh + +# +# Script for image configure +# @smirart Smirnov Artem +# + + +# PREFIX_PATH=/mnt +# IMAGE=/home/pi/2017-11-29-raspbian-stretch-lite.img +# +# # blkid +# UUID_BOOT=CDD4-B453 +# UUID_ROOTFS=72bfc10d-73ec-4d9e-a54a-1cc507ee7ed2 +# +# # /dev/disk/by-label/boot +# DEV_BOOT=/dev/disk/by-uuid/$UUID_BOOT +# # /dev/disk/by-label$2 +# DEV_ROOTFS=/dev/disk/by-uuid/$UUID_ROOTFS + + +get_image() { + +# STATIC +# TEMPLATE: get_image $JENKINS_HOME $RPI_ZIP_NAME $RPI_DONWLOAD_URL $RPI_IMAGE_NAME $IMAGE_NAME + + echo 'Download RaspbianOS' + echo "$(date) | 1. Download raspbian lite" + if [ ! -e "$1/$2" ]; + then wget -nv -O $1/$2 $3 + fi + echo "$(date) | Downloading complete" + echo 'Unzip image' + echo "$(date) | 2. Unzip raspbian lite" + if [ ! -e "$1/$4" ]; + then unzip -uo $1/$2 -d $1 + fi + echo "$(date) | Unziping complete" + echo 'Duplicate image' + cp -f $1/$4 $1/$5 +} + + +resize_fs() { + + # STATIC + # TEMPLATE: resize_fs $SIZE $JENKINS_HOME $IMAGE_NAME $DEV_ROOTFS + + # https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D1%91%D0%BD%D0%BD%D1%8B%D0%B9_%D1%84%D0%B0%D0%B9%D0%BB + + # https://raspberrypi.stackexchange.com/questions/13137/how-can-i-mount-a-raspberry-pi-linux-distro-image + # fdisk -l 2017-11-29-raspbian-stretch-lite.img + # https://www.stableit.ru/2011/05/losetup.html + # -f : losetup сам выбрал loop (минуя занятые) + # -P : losetup монтирует разделы в образе как отдельные подразделы, + # например /dev/loop0p1 и /dev/loop0p2 + # --show : печатает имя устройства, например /dev/loop4 + + # http://karelzak.blogspot.ru/2015/05/resize-by-sfdisk.html + # ", +" : расширяет раздел до размеров образа + # -N 2 : выбирает раздел 2 для работы + + echo -e "\033[0;31m\033[1mTruncate image\033[0m\033[0m" \ + && truncate -s$1 $2/$3 \ + && echo "Mount loop-image: $2/$3" \ + && local DEV_IMAGE=$(losetup -Pf $2/$3 --show) \ + && sleep 0.5 \ + && echo -e "\033[0;31m\033[1mMount loop-image: $1\033[0m\033[0m" \ + && echo ", +" | sfdisk -N 2 $DEV_IMAGE \ + && sleep 0.5 \ + && echo -e "\033[0;31m\033[1mCheck & repair filesystem after expand partition\033[0m\033[0m" \ + && e2fsck -fvy $4 \ + && echo -e "\033[0;31m\033[1mExpand filesystem\033[0m\033[0m" \ + && resize2fs $4 \ + && echo -e "\033[0;31m\033[1mUmount loop-image\033[0m\033[0m" \ + && losetup -d $DEV_IMAGE +} + +publish_image() { + +# STATIC +# TEMPLATE: publish_image $JENKINS_HOME $IMAGE_NAME $WORKSPACE $CONFIG_FILE $RELEASE_ID $RELEASE_BODY + +# https://developer.github.com/v3/repos/releases/ +#RELEASE_BODY="### Changelog\n* Add /boot/cmdline.txt net.ifnames=0 https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/\n* Updated cophelper\n* Installed copstat" + + echo 'Zip image' \ + && zip $1/$2.zip $1/$2 \ + && echo 'Upload image' \ + && local IMAGE_LINK=$($3/deploy/yadisk.py $1/$4 $1/$2.zip) \ + && local IMAGE_SIZE=$(du -sh $1/$2.zip | awk '{ print $1 }') \ + && $3/deploy/git_release.py $1/$4 $5 $6 $2 $IMAGE_LINK $IMAGE_SIZE +} + +publish_image2() { + +# STATIC +# TEMPLATE: publish_image $JENKINS_HOME $IMAGE_NAME $WORKSPACE $CONFIG_FILE $RELEASE_ID $RELEASE_BODY + +# https://developer.github.com/v3/repos/releases/ +#RELEASE_BODY="### Changelog\n* Add /boot/cmdline.txt net.ifnames=0 https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/\n* Updated cophelper\n* Installed copstat" + + echo 'Zip image' \ + && zip $1/$2.zip $1/$2 \ + && echo 'Upload image' \ + && local IMAGE_LINK=$($3/deploy/yadisk.py $1/$4 $1/$2.zip) \ + && local IMAGE_SIZE=$(du -sh $1/$2.zip | awk '{ print $1 }') \ + && local NEW_RELEASE_BODY="### Download\n* [$2.zip]($IMAGE_LINK) ($IMAGE_SIZE)\n\n$6" \ + && local DATA="{ \"body\":\"$NEW_RELEASE_BODY\" }" \ + && curl -d "$(echo $DATA)" -u "LOGIN:PASS" --request PATCH https://api.github.com/repos/ONWER/REPO/releases/$5 +} + +mount_system() { + + # STATIC + # TEMPLATE: mount_system $IMAGE $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT + + # https://www.stableit.ru/2011/05/losetup.html + # -f : losetup выбирает незанятое имя устройства, например /dev/loop2 + # -P : losetup монтирует разделы в образе как отдельные подразделы, + # например /dev/loop0p1 и /dev/loop0p2 + # --show : печатает имя устройства, например /dev/loop4 + + echo -e "\033[0;31m\033[1mMount loop-image: $1\033[0m\033[0m" + DEV_IMAGE=$(losetup -Pf $1 --show) + sleep 0.5 + + echo -e "\033[0;31m\033[1mMount dirs $2 & $2/boot\033[0m\033[0m" + mount $3 $2 + mount $4 $2/boot + + echo -e "\033[0;31m\033[1mBind system dirs\033[0m\033[0m" + # https://github.com/debian-pi/raspbian-ua-netinst/issues/314 + echo "Mounting /proc in chroot... " + if [ ! -d $2/proc ] ; then + mkdir -p $2/proc + echo "Created $2/proc" + fi + mount -t proc -o nosuid,noexec,nodev proc $2/proc + echo "OK" + + echo "Mounting /sys in chroot... " + if [ ! -d $2/sys ] ; then + mkdir -p $2/sys + echo "Created $2/sys" + fi + mount -t sysfs -o nosuid,noexec,nodev sysfs $2/sys + echo "OK" + + echo "Mounting /dev/ and /dev/pts in chroot... " + mkdir -p -m 755 $2/dev/pts + mount -t devtmpfs -o mode=0755,nosuid devtmpfs $2/dev + mount -t devpts -o gid=5,mode=620 devpts $2/dev/pts + # mount -t devpts none "$2/dev/pts" -o ptmxmode=0666,newinstance + # ln -fs "pts/ptmx" "$2/dev/ptmx" + echo "OK" + + + # mount -o bind /dev $2/dev + # mount -t proc proc $2/proc + # mount -t devpts devpts $2/dev/pts + + # mount -t proc proc $2/proc + # mount -t sysfs sys $2/sys + # mount --bind /dev $2/dev + + echo -e "\033[0;31m\033[1mCopy DNS records\033[0m\033[0m" + cp -L /etc/resolv.conf $2/etc/resolv.conf + + # https://wiki.archlinux.org/index.php/Change_root_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) + # http://www.unix-lab.org/posts/chroot/ + # https://habrahabr.ru/post/141012/ + # https://losst.ru/vosstanovlenie-grub2 + # http://unixteam.ru/content/virtualizaciya-ili-zapuskaem-prilozhenie-v-chroot-okruzhenii-razmyshleniya + # http://help.ubuntu.ru/wiki/%D0%B2%D0%BE%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_grub + echo -e "\033[0;31m\033[1mEnter chroot\033[0m\033[0m" + chroot $2 /bin/bash +} + +mount_system2() { + + # STATIC + # TEMPLATE: mount_system2 $IMAGE $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT + + echo -e "\033[0;31m\033[1mMount loop-image: $1\033[0m\033[0m" + DEV_IMAGE=$(losetup -Pf $1 --show) + sleep 0.5 + + echo -e "\033[0;31m\033[1mMount dirs $2 & $2/boot\033[0m\033[0m" + mount $3 $2 + mount $4 $2/boot + + echo -e "\033[0;31m\033[1mBind system dirs\033[0m\033[0m" + echo "Mounting /proc in chroot... " + if [ ! -d $2/proc ] ; then + mkdir -p $2/proc + echo "Created $2/proc" + fi + mount -t proc -o nosuid,noexec,nodev proc $2/proc + echo "OK" + + echo "Mounting /sys in chroot... " + if [ ! -d $2/sys ] ; then + mkdir -p $2/sys + echo "Created $2/sys" + fi + mount -t sysfs -o nosuid,noexec,nodev sysfs $2/sys + echo "OK" + + echo "Mounting /dev/ and /dev/pts in chroot... " + mkdir -p -m 755 $2/dev/pts + mount -t devtmpfs -o mode=0755,nosuid devtmpfs $2/dev + mount -t devpts -o gid=5,mode=620 devpts $2/dev/pts + echo "OK" + + echo -e "\033[0;31m\033[1mCopy DNS records\033[0m\033[0m" + cp -L /etc/resolv.conf $2/etc/resolv.conf + + echo -e "\033[0;31m\033[1m$(date) | Enter chroot\033[0m\033[0m" + chroot $2 /bin/bash -c "$3" +} + +umount_system() { + + # STATIC + # TEMPLATE: umount_system $PREFIX_PATH + + echo -e "\033[0;31m\033[1m$(date) | Umount recursive dirs: $1\033[0m\033[0m" + umount -R $1 + echo -e "\033[0;31m\033[1m$(date) | Umount loop-image\033[0m\033[0m" + losetup -d $DEV_IMAGE +} + +umount_system2() { + + # STATIC + # TEMPLATE: umount_system $PREFIX_PATH + + echo -e "\033[0;31m\033[1m$(date) | Umount recursive dirs: $1\033[0m\033[0m" + umount -R $1 + echo -e "\033[0;31m\033[1m$(date) | Umount loop-image\033[0m\033[0m" + losetup -D +} + +set_config_var() { + lua - "$1" "$2" "$3" < "$3.bak" +local key=assert(arg[1]) +local value=assert(arg[2]) +local fn=assert(arg[3]) +local file=assert(io.open(fn)) +local made_change=false +for line in file:lines() do + if line:match("^#?%s*"..key.."=.*$") then + line=key.."="..value + made_change=true + end + print(line) +end + +if not made_change then + print(key.."="..value) +end +EOF + mv "$3.bak" "$3" +} + +configure_system() { + + # STATIC + # TEMPLATE: configure_system $IMAGE $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT + + local BLACKLIST=/etc/modprobe.d/raspi-blacklist.conf + local CONFIG=/boot/config.txt + + BLACKLIST=$2$BLACKLIST + CONFIG=$2$CONFIG + + # 1. Примонитровать образ + + # https://raspberrypi.stackexchange.com/questions/13137/how-can-i-mount-a-raspberry-pi-linux-distro-image + # mount -v -o offset=48234496 -t ext4 2017-11-29-raspbian-stretch-lite.img $PREFIX_PATH + # mount -v -o offset=4194304,sizelimit=29360128 -t vfat 2017-11-29-raspbian-stretch-lite.img $PREFIX_PATH/boot + # + # fdisk -l 2017-11-29-raspbian-stretch-lite.img + # https://www.stableit.ru/2011/05/losetup.html + # -f : losetup сам выбрал loop (минуя занятые) + # -P : losetup монтирует разделы в образе как отдельные подразделы, + # например /dev/loop0p1 и /dev/loop0p2 + # --show : печатает имя устройства, например /dev/loop4 + echo -e "\033[0;31m\033[1mMount loop-image: $1\033[0m\033[0m" + DEV_IMAGE=$(losetup -Pf $1 --show) + sleep 0.5 + + echo -e "\033[0;31m\033[1mMount dirs $2 & $2/boot\033[0m\033[0m" + mount $3 $2 + mount $4 $2/boot + + # 2. Изменить необходимые настройки + + # 2.1. Включить sshd + echo -e "\033[0;31m\033[1mTurn on sshd\033[0m\033[0m" + touch $2/boot/ssh + + # 2.2. Включить GPIO + # Включено по умолчанию + + # 2.3. Включить I2C + echo -e "\033[0;31m\033[1mTurn on I2C\033[0m\033[0m" + + set_config_var dtparam=i2c_arm on $CONFIG && + if ! [ -e $BLACKLIST ]; then + touch $BLACKLIST + fi + sed $BLACKLIST -i -e "s/^\(blacklist[[:space:]]*i2c[-_]bcm2708\)/#\1/" + sed $2/etc/modules -i -e "s/^#[[:space:]]*\(i2c[-_]dev\)/\1/" + if ! grep -q "^i2c[-_]dev" $2/etc/modules; then + printf "i2c-dev\n" >> $2/etc/modules + fi + + # 2.4. Включить SPI + echo -e "\033[0;31m\033[1mTurn on SPI\033[0m\033[0m" + + set_config_var dtparam=spi on $CONFIG && + if ! [ -e $BLACKLIST ]; then + touch $BLACKLIST + fi + sed $BLACKLIST -i -e "s/^\(blacklist[[:space:]]*spi[-_]bcm2708\)/#\1/" + + # 2.5. Включить raspicam + # Включена по умолчанию вроде как + + # 2.6. Настроить AP wifi + # 2.7. Настроить сеть на wlan + # 2.8. Настроить DHCPd на wlan + + # Отмонтировать образ + umount_system $2 +} + + +prepare_fs() { + + # STATIC + # TEMPLATE: prepare_fs $IMAGE $SIZE + + date + # Удаляем старый образ + # -f : не выводить ошибки, если файла нет + rm -f $1 + # Копируем origin образ + # --progress : Вывод прогресс-бара + rsync --progress -av $1.orig $1 + expand_image $1 $2G + date +} + +install_docker() { + + # STATIC + # TEMPLATE: install_docker $IMAGE $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT + + # https://askubuntu.com/questions/485567/unexpected-end-of-file + mount_system $1 $2 $3 $4 << EOF +#!/bin/bash +# https://www.raspberrypi.org/blog/docker-comes-to-raspberry-pi/ +curl -sSL https://get.docker.com | sh +usermod -aG docker pi +systemctl enable docker +service docker start +docker pull smirart/rpi-ros:sshd +docker run -di --restart unless-stopped -p 192.168.0.121:2202:22 -t smirart/rpi-ros:sshd +EOF + umount_system $2 +} + +test_docker() { + + # STATIC + # TEMPLATE: test_docker $IMAGE $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT + + mount_system $1 $2 $3 $4 << EOF +#!/bin/bash +# https://www.raspberrypi.org/blog/docker-comes-to-raspberry-pi/ +service docker start +sleep 1 +docker images +docker ps -a +EOF + umount_system $2 +} + +enter() { + + # STATIC + # TEMPLATE: enter $IMAGE $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT + + mount_system $1 $2 $3 $4 + umount_system $2 +} + +execute() { + + # STATIC + # TEMPLATE: execute $IMAGE $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $EXECUTE_FILE + + mount_system2 $1 $2 $3 $4 "$(cat $5)" + umount_system2 $2 +} + + +# очистить history +# https://askubuntu.com/questions/191999/how-to-clear-bash-history-completely +# cat /dev/null > ~/.bash_history && history -c && exit +# +# screen in chroot +# getty tty +# https://stackoverflow.com/questions/19104894/screen-must-be-connected-to-a-terminal/25646444 +# +# docker in chroot +# service docker start +# https://forums.docker.com/t/cannot-connect-to-the-docker-daemon-is-the-docker-daemon-running-on-this-host/8925/17 + + +if [ $(whoami) != "root" ]; +then echo "" \ + && echo "********************************************************************" \ + && echo "******************** This should be run as root ********************" \ + && echo "********************************************************************" \ + && echo "" \ + && exit 1 +fi + + +echo "\$#: $#" +echo "\$1: $1" +echo "\$2: $2" +echo "\$3: $3" +echo "\$4: $4" +echo "\$5: $5" +echo "\$6: $6" + + +# test_docker +# install_docker +# prepare_fs +# configure_system + +case "$1" in + enter) + enter;; + + get_image) # get_image $JENKINS_HOME $RPI_ZIP_NAME $RPI_DONWLOAD_URL $RPI_IMAGE_NAME $IMAGE_NAME + get_image $2 $3 $4 $5 $6;; + + resize_fs) # resize_fs $SIZE $JENKINS_HOME $IMAGE_NAME $DEV_ROOTFS + resize_fs $2 $3 $4 $5;; + + publish_image) # publish_image $JENKINS_HOME $IMAGE_NAME $WORKSPACE $CONFIG_FILE $RELEASE_ID $RELEASE_BODY + publish_image $2 $3 $4 $5 $6 $7;; + + execute) # execute $IMAGE $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $EXECUTE_FILE + execute $2 $3 $4 $5 $6;; + + *) + echo "Enter one of: enter, get_image, resize_fs, publish_image, execute";; +esac diff --git a/image/ros.sh b/image/ros.sh new file mode 100755 index 00000000..63079f11 --- /dev/null +++ b/image/ros.sh @@ -0,0 +1,191 @@ +#!/bin/bash + +################################################################################################################################## +# ROS for user pi +################################################################################################################################## + +# ros http://wiki.ros.org/action/fullsearch/ROSberryPi/Installing%20ROS%20Kinetic%20on%20the%20Raspberry%20Pi +# maintainer @urpylka + +echo -e "\033[0;31m\033[1m$(date) | #0 Install ROS\033[0m\033[0m" + + + + +echo -e "\033[0;31m\033[1m$(date) | #1 Install dirmngr & add key to apt-key\033[0m\033[0m" + +# по умолчанию dirmngr отсуствует на образе и требуется для установки ключа +# http://wpblogger.su/tags/apt/ +apt install dirmngr +# setup keys +apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116 + +# setup sources.list +echo "deb http://packages.ros.org/ros/ubuntu stretch main" > /etc/apt/sources.list.d/ros-latest.list + + + + +echo -e "\033[0;31m\033[1m$(date) | #2 apt update && apt upgrade\033[0m\033[0m" + +# install bootstrap tools +apt update +# && apt upgrade -y + + + + +echo -e "\033[0;31m\033[1m$(date) | #3 Install wget, unzip, python-rosdep, python-rosinstall-generator, python-wstool, python-rosinstall, build-essential, cmake\033[0m\033[0m" + +apt-get install --no-install-recommends -y \ + wget \ + unzip \ + python-rosdep \ + python-rosinstall-generator \ + python-wstool \ + python-rosinstall \ + build-essential \ + cmake \ + libjpeg8-dev + + + +echo -e "\033[0;31m\033[1m$(date) | #4 rosdep init && rosdep update\033[0m\033[0m" + +# bootstrap rosdep +rosdep init && rosdep update + + + + +echo -e "\033[0;31m\033[1m$(date) | #5 Prepare ros_comm packages to kinetic-ros_comm-wet.rosinstall\033[0m\033[0m" + +# create catkin workspace +mkdir -p /home/pi/ros_catkin_ws && cd /home/pi/ros_catkin_ws \ + && rosinstall_generator ros_comm --rosdistro kinetic --deps --wet-only --tar > kinetic-ros_comm-wet.rosinstall \ + && wstool init src kinetic-ros_comm-wet.rosinstall + + + +echo -e "\033[0;31m\033[1m$(date) | #6 Install assimp-3.1.1 to /home/pi/ros_catkin_ws/external_src\033[0m\033[0m" + +# Unavailable Dependencies +mkdir -p /home/pi/ros_catkin_ws/external_src \ + && cd /home/pi/ros_catkin_ws/external_src \ + && wget http://sourceforge.net/projects/assimp/files/assimp-3.1/assimp-3.1.1_no_test_models.zip/download -O assimp-3.1.1_no_test_models.zip \ + && unzip assimp-3.1.1_no_test_models.zip \ + && cd assimp-3.1.1 \ + && cmake . \ + && make \ + && make install + + + + +echo -e "\033[0;31m\033[1m$(date) | #7 Prepare other ROS-packages to kinetic-custom_ros.rosinstall\033[0m\033[0m" + +cd /home/pi/ros_catkin_ws \ + && rosinstall_generator \ + actionlib actionlib_msgs angles async_web_server_cpp bond bond_core bondcpp bondpy camera_calibration_parsers camera_info_manager catkin class_loader cmake_modules cpp_common cv_bridge cv_camera diagnostic_msgs diagnostic_updater dynamic_reconfigure eigen_conversions gencpp geneus genlisp genmsg gennodejs genpy geographic_msgs geometry_msgs geometry2 image_transport libmavconn mavlink mavros_msgs message_filters message_generation message_runtime mk nav_msgs nodelet orocos_kdl pluginlib python_orocos_kdl ros ros_comm rosapi rosauth rosbag rosbag_migration_rule rosbag_storage rosbash rosboost_cfg rosbridge_library rosbridge_server rosbridge_suite rosbuild rosclean rosconsole rosconsole_bridge roscpp roscpp_serialization roscpp_traits roscreate rosgraph rosgraph_msgs roslang roslaunch roslib roslint roslisp roslz4 rosmake rosmaster rosmsg rosnode rosout rospack rosparam rospy rospy_tutorials rosserial rosserial_client rosserial_msgs rosserial_python rosservice rostest rostime rostopic rosunit roswtf sensor_msgs smclib std_msgs std_srvs stereo_msgs tf tf2 tf2_bullet tf2_eigen tf2_geometry_msgs tf2_kdl tf2_msgs tf2_py tf2_ros tf2_sensor_msgs tf2_tools topic_tools trajectory_msgs urdf urdf_parser_plugin usb_cam uuid_msgs visualization_msgs web_video_server xmlrpcpp mavros opencv3 mavros_extras \ + --rosdistro kinetic --deps --wet-only --tar > kinetic-custom_ros.rosinstall \ + && wstool merge -t src kinetic-custom_ros.rosinstall \ + && wstool update -t src + + + + +echo -e "\033[0;31m\033[1m$(date) | #8 Install dependencies apps with rosdep\033[0m\033[0m" + +# как я понял установка apt-get всяких зависимостей для ros-пакетов +# Resolving Dependencies with rosdep +cd /home/pi/ros_catkin_ws \ + && rosdep install -y --from-paths src --ignore-src --rosdistro kinetic -r --os=debian:stretch + + + + +echo -e "\033[0;31m\033[1m$(date) | #9 Refactor usb_cam in SRC\033[0m\033[0m" + +# добавление префикса с помощью двух define +# #define PIX_FMT_RGB24 AV_PIX_FMT_RGB24 +# #define PIX_FMT_YUV422P AV_PIX_FMT_YUV422P + +sed -i '/#define __STDC_CONSTANT_MACROS/a\#define PIX_FMT_RGB24 AV_PIX_FMT_RGB24\n#define PIX_FMT_YUV422P AV_PIX_FMT_YUV422P' /home/pi/ros_catkin_ws/src/usb_cam/src/usb_cam.cpp + + + +echo -e "\033[0;31m\033[1m$(date) | #10 Install GeographicLib datasets\033[0m\033[0m" + +/home/pi/ros_catkin_ws/src/mavros/mavros/scripts/install_geographiclib_datasets.sh + + + + +echo -e "\033[0;31m\033[1m$(date) | #11 Build light packages on 2 threads\033[0m\033[0m" + +# Building the catkin Workspace +cd /home/pi/ros_catkin_ws && ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/kinetic -j2 --pkg actionlib actionlib_msgs angles async_web_server_cpp bond bond_core bondcpp bondpy camera_calibration_parsers camera_info_manager catkin class_loader cmake_modules cpp_common diagnostic_msgs diagnostic_updater dynamic_reconfigure eigen_conversions gencpp geneus genlisp genmsg gennodejs genpy geographic_msgs geometry_msgs geometry2 image_transport libmavconn mavlink mavros_msgs message_filters message_generation message_runtime mk nav_msgs nodelet orocos_kdl pluginlib python_orocos_kdl ros ros_comm rosapi rosauth rosbag rosbag_migration_rule rosbag_storage rosbash rosboost_cfg rosbridge_library rosbridge_server rosbridge_suite rosbuild rosclean rosconsole rosconsole_bridge roscpp roscpp_serialization roscpp_traits roscreate rosgraph rosgraph_msgs roslang roslaunch roslib roslint roslisp roslz4 rosmake rosmaster rosmsg rosnode rosout rospack rosparam rospy rospy_tutorials rosserial rosserial_client rosserial_msgs rosserial_python rosservice rostest rostime rostopic rosunit roswtf sensor_msgs smclib std_msgs std_srvs stereo_msgs tf tf2 tf2_bullet tf2_eigen tf2_geometry_msgs tf2_kdl tf2_msgs tf2_py tf2_ros tf2_sensor_msgs tf2_tools topic_tools trajectory_msgs urdf urdf_parser_plugin usb_cam uuid_msgs visualization_msgs xmlrpcpp + + + + +echo -e "\033[0;31m\033[1m$(date) | #12 Build heavy packages\033[0m\033[0m" + +# Building the catkin Workspace +cd /home/pi/ros_catkin_ws && ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/kinetic -j1 --pkg mavros opencv3 cv_bridge cv_camera mavros_extras web_video_server + + + +echo -e "\033[0;31m\033[1m$(date) | #13 Create catkin_ws\033[0m\033[0m" + +mkdir -p /home/pi/catkin_ws/src \ + && cd /home/pi/catkin_ws \ + && source /opt/ros/kinetic/setup.bash \ + && catkin init \ + && wstool init /home/pi/catkin_ws/src + + + + +echo -e "\033[0;31m\033[1m$(date) | #14 Install CLEVER-BUNDLE\033[0m\033[0m" + +cd /home/pi/catkin_ws/src \ + && git clone https://github.com/CopterExpress/clever_bundle.git clever \ + && pip install wheel \ + && pip install -r /home/pi/catkin_ws/src/clever/clever/requirements.txt \ + && cd /home/pi/catkin_ws \ + && source /opt/ros/kinetic/setup.bash \ + && catkin_make -j1 \ + && systemctl enable /home/pi/catkin_ws/src/clever/deploy/roscore.service \ + && systemctl enable /home/pi/catkin_ws/src/clever/deploy/clever.service + + + +echo -e "\033[0;31m\033[1m$(date) | #15 Add mjpg-streamer at /home/pi\033[0m\033[0m" + +# https://github.com/jacksonliam/mjpg-streamer + +cd /home/pi \ + && git clone https://github.com/jacksonliam/mjpg-streamer.git \ + && cd /home/pi/mjpg-streamer/mjpg-streamer-experimental \ + && make \ + && make install + + + +echo -e "\033[0;31m\033[1m$(date) | #16 Add ENV vars\033[0m\033[0m" + +# setup environment +echo "LANG=C.UTF-8" >> /home/pi/.bashrc +echo "LC_ALL=C.UTF-8" >> /home/pi/.bashrc +echo "ROS_DISTRO=kinetic" >> /home/pi/.bashrc +echo "export ROS_IP=192.168.11.1" >> /home/pi/.bashrc + +echo "source /opt/ros/kinetic/setup.bash" >> /home/pi/.bashrc \ + && echo "source /home/pi/catkin_ws/devel/setup.bash" >> /home/pi/.bashrc + +chown -Rf pi:pi /home/pi + + + +echo -e "\033[0;31m\033[1m$(date) | #17 END of ROS INSTALLATION\033[0m\033[0m" diff --git a/image/yadisk.py b/image/yadisk.py new file mode 100755 index 00000000..b42c4c8c --- /dev/null +++ b/image/yadisk.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python + +# +# Simple python uploader to YaDisk +# Smirnov Artem @urpylka +# +# Use: +# python yadisk.py login password file server_dir +# + +from YaDiskClient.YaDiskClient import YaDisk +import os.path, sys + +def upload(_login, _password, _server_dir, _file): + if os.path.isfile(_file): + disk = YaDisk(_login, _password) + disk.upload(_file, _server_dir + '/' + os.path.basename(_file)) + link = disk.publish_doc(_server_dir + '/' + os.path.basename(_file)) + print link + else: + print "Error: file-path is bad" + return 1 + +def main(): + if (len(sys.argv) == 5): + print "login: " + sys.argv[1] + print "password: " + sys.argv[2] + print "server_dir: " + sys.argv[3] + print "file: " + sys.argv[4] + + upload(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4]) + + elif (len(sys.argv) == 3): + # print "config: " + sys.argv[1] + # print "file: " + sys.argv[2] + + if os.path.isfile(sys.argv[1]) and os.path.isfile(sys.argv[2]): + + from ConfigParser import SafeConfigParser + cfgParser = SafeConfigParser() + cfgParser.read(sys.argv[1]) + # print "login: " + cfgParser.get('yadisk','login') + # print "password: " + cfgParser.get('yadisk','password') + # print "server_dir: " + cfgParser.get('yadisk','server_dir') + + upload(cfgParser.get('yadisk','login'), cfgParser.get('yadisk','password'), cfgParser.get('yadisk','server_dir'), sys.argv[2]) + else: + print "Error: file-path or config-path is bad" + return 1 + else: + print "Error: amount of args is incorrect" + return 1 + +if __name__ == '__main__': + main() From 1e3626ffdd2d775e686efd75fbebe575f1654a1d Mon Sep 17 00:00:00 2001 From: urpylka Date: Tue, 6 Feb 2018 23:18:04 +0300 Subject: [PATCH 127/149] New path of repo after merge clever & clever_bundle repos --- image/ros.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image/ros.sh b/image/ros.sh index 63079f11..897de908 100755 --- a/image/ros.sh +++ b/image/ros.sh @@ -150,7 +150,7 @@ mkdir -p /home/pi/catkin_ws/src \ echo -e "\033[0;31m\033[1m$(date) | #14 Install CLEVER-BUNDLE\033[0m\033[0m" cd /home/pi/catkin_ws/src \ - && git clone https://github.com/CopterExpress/clever_bundle.git clever \ + && git clone https://github.com/CopterExpress/clever.git clever \ && pip install wheel \ && pip install -r /home/pi/catkin_ws/src/clever/clever/requirements.txt \ && cd /home/pi/catkin_ws \ From a35519ffc306d4867bbcc7fac0257fc58fde5222 Mon Sep 17 00:00:00 2001 From: urpylka Date: Wed, 7 Feb 2018 22:45:45 +0300 Subject: [PATCH 128/149] Replace 'image/' to 'deploy/' in CI-tools --- image/Jenkinsfile | 12 ++++++------ image/image-config.sh | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/image/Jenkinsfile b/image/Jenkinsfile index 7ca842c2..e43979a9 100644 --- a/image/Jenkinsfile +++ b/image/Jenkinsfile @@ -9,7 +9,7 @@ pipeline { RPI_IMAGE_NAME = '2017-11-29-raspbian-stretch-lite.img' } steps { - sh '$WORKSPACE/deploy/image-config.sh get_image $JENKINS_HOME $RPI_ZIP_NAME $RPI_DONWLOAD_URL $RPI_IMAGE_NAME $IMAGE_NAME' + sh '$WORKSPACE/image/image-config.sh get_image $JENKINS_HOME $RPI_ZIP_NAME $RPI_DONWLOAD_URL $RPI_IMAGE_NAME $IMAGE_NAME' } } stage('Resize FS') { @@ -17,7 +17,7 @@ pipeline { SIZE = '7G' } steps { - sh '$WORKSPACE/deploy/image-config.sh resize_fs $SIZE $JENKINS_HOME $IMAGE_NAME $DEV_ROOTFS' + sh '$WORKSPACE/image/image-config.sh resize_fs $SIZE $JENKINS_HOME $IMAGE_NAME $DEV_ROOTFS' } } stage('Configure interfaces') { @@ -25,7 +25,7 @@ pipeline { EXECUTE_FILE = 'iface.sh' } steps { - sh '$WORKSPACE/deploy/image-config.sh execute $JENKINS_HOME/$IMAGE_NAME $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $WORKSPACE/deploy/$EXECUTE_FILE' + sh '$WORKSPACE/image/image-config.sh execute $JENKINS_HOME/$IMAGE_NAME $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $WORKSPACE/image/$EXECUTE_FILE' } } stage('Install Apps') { @@ -33,7 +33,7 @@ pipeline { EXECUTE_FILE = 'apps.sh' } steps { - sh '# $WORKSPACE/deploy/image-config.sh execute $JENKINS_HOME/$IMAGE_NAME $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $WORKSPACE/deploy/$EXECUTE_FILE' + sh '# $WORKSPACE/image/image-config.sh execute $JENKINS_HOME/$IMAGE_NAME $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $WORKSPACE/image/$EXECUTE_FILE' } } stage('Install ROS') { @@ -41,7 +41,7 @@ pipeline { EXECUTE_FILE = 'ros.sh' } steps { - sh '# $WORKSPACE/deploy/image-config.sh execute $JENKINS_HOME/$IMAGE_NAME $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $WORKSPACE/deploy/$EXECUTE_FILE' + sh '# $WORKSPACE/image/image-config.sh execute $JENKINS_HOME/$IMAGE_NAME $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $WORKSPACE/image/$EXECUTE_FILE' } } stage('Publish image') { @@ -49,7 +49,7 @@ pipeline { CONFIG_FILE = 'coex-ci.conf' } steps { - sh '$WORKSPACE/deploy/image-config.sh publish_image $JENKINS_HOME $IMAGE_NAME $WORKSPACE $CONFIG_FILE $RELEASE_ID $RELEASE_BODY' + sh '$WORKSPACE/image/image-config.sh publish_image $JENKINS_HOME $IMAGE_NAME $WORKSPACE $CONFIG_FILE $RELEASE_ID $RELEASE_BODY' } } } diff --git a/image/image-config.sh b/image/image-config.sh index 134a3d7d..1580ea67 100755 --- a/image/image-config.sh +++ b/image/image-config.sh @@ -88,9 +88,9 @@ publish_image() { echo 'Zip image' \ && zip $1/$2.zip $1/$2 \ && echo 'Upload image' \ - && local IMAGE_LINK=$($3/deploy/yadisk.py $1/$4 $1/$2.zip) \ + && local IMAGE_LINK=$($3/image/yadisk.py $1/$4 $1/$2.zip) \ && local IMAGE_SIZE=$(du -sh $1/$2.zip | awk '{ print $1 }') \ - && $3/deploy/git_release.py $1/$4 $5 $6 $2 $IMAGE_LINK $IMAGE_SIZE + && $3/image/git_release.py $1/$4 $5 $6 $2 $IMAGE_LINK $IMAGE_SIZE } publish_image2() { @@ -104,7 +104,7 @@ publish_image2() { echo 'Zip image' \ && zip $1/$2.zip $1/$2 \ && echo 'Upload image' \ - && local IMAGE_LINK=$($3/deploy/yadisk.py $1/$4 $1/$2.zip) \ + && local IMAGE_LINK=$($3/image/yadisk.py $1/$4 $1/$2.zip) \ && local IMAGE_SIZE=$(du -sh $1/$2.zip | awk '{ print $1 }') \ && local NEW_RELEASE_BODY="### Download\n* [$2.zip]($IMAGE_LINK) ($IMAGE_SIZE)\n\n$6" \ && local DATA="{ \"body\":\"$NEW_RELEASE_BODY\" }" \ From 68fd233b8d1c1157560f73360a384c1a12f2289f Mon Sep 17 00:00:00 2001 From: urpylka Date: Wed, 7 Feb 2018 23:09:27 +0300 Subject: [PATCH 129/149] Add burn_image(), fix argument for mount_system2() & enter() --- image/image-config.sh | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/image/image-config.sh b/image/image-config.sh index 1580ea67..7ed9c1ec 100755 --- a/image/image-config.sh +++ b/image/image-config.sh @@ -41,7 +41,6 @@ get_image() { cp -f $1/$4 $1/$5 } - resize_fs() { # STATIC @@ -111,6 +110,25 @@ publish_image2() { && curl -d "$(echo $DATA)" -u "LOGIN:PASS" --request PATCH https://api.github.com/repos/ONWER/REPO/releases/$5 } +burn_image() { + +# STATIC +# TEMPLATE: burn_image $IMAGE_PATH $MICROSD_DEV + + echo -e "\033[0;31m\033[1mBurn image\033[0m\033[0m" \ + && dd if=$1 of=$2 \ + && echo -e "\033[0;31m\033[1mBurn image finished!\033[0m\033[0m" +} + +burn_and_reboot() { + +# STATIC +# TEMPLATE: burn_and_reboot $IMAGE_PATH $MICROSD_DEV + + burn_image $1 $2 \ + && reboot +} + mount_system() { # STATIC @@ -181,7 +199,7 @@ mount_system() { mount_system2() { # STATIC - # TEMPLATE: mount_system2 $IMAGE $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT + # TEMPLATE: mount_system2 $IMAGE $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $EXECUTE_FILE echo -e "\033[0;31m\033[1mMount loop-image: $1\033[0m\033[0m" DEV_IMAGE=$(losetup -Pf $1 --show) @@ -218,7 +236,7 @@ mount_system2() { cp -L /etc/resolv.conf $2/etc/resolv.conf echo -e "\033[0;31m\033[1m$(date) | Enter chroot\033[0m\033[0m" - chroot $2 /bin/bash -c "$3" + chroot $2 /bin/bash -c "$5" } umount_system() { @@ -447,8 +465,8 @@ echo "\$6: $6" # configure_system case "$1" in - enter) - enter;; + enter) # enter $IMAGE $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT + enter $2 $3 $4 $5;; get_image) # get_image $JENKINS_HOME $RPI_ZIP_NAME $RPI_DONWLOAD_URL $RPI_IMAGE_NAME $IMAGE_NAME get_image $2 $3 $4 $5 $6;; @@ -464,4 +482,4 @@ case "$1" in *) echo "Enter one of: enter, get_image, resize_fs, publish_image, execute";; -esac +esac \ No newline at end of file From f8316f345a6e4626b29d72e3871cf4fac91fd81d Mon Sep 17 00:00:00 2001 From: urpylka Date: Wed, 7 Feb 2018 23:25:07 +0300 Subject: [PATCH 130/149] Fix: uncomment build strings after debug --- image/Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/image/Jenkinsfile b/image/Jenkinsfile index e43979a9..bbb59ba9 100644 --- a/image/Jenkinsfile +++ b/image/Jenkinsfile @@ -33,7 +33,7 @@ pipeline { EXECUTE_FILE = 'apps.sh' } steps { - sh '# $WORKSPACE/image/image-config.sh execute $JENKINS_HOME/$IMAGE_NAME $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $WORKSPACE/image/$EXECUTE_FILE' + sh '$WORKSPACE/image/image-config.sh execute $JENKINS_HOME/$IMAGE_NAME $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $WORKSPACE/image/$EXECUTE_FILE' } } stage('Install ROS') { @@ -41,7 +41,7 @@ pipeline { EXECUTE_FILE = 'ros.sh' } steps { - sh '# $WORKSPACE/image/image-config.sh execute $JENKINS_HOME/$IMAGE_NAME $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $WORKSPACE/image/$EXECUTE_FILE' + sh '$WORKSPACE/image/image-config.sh execute $JENKINS_HOME/$IMAGE_NAME $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $WORKSPACE/image/$EXECUTE_FILE' } } stage('Publish image') { From 151a515f61b04202ee380ab51b307d5921a17c05 Mon Sep 17 00:00:00 2001 From: urpylka Date: Thu, 8 Feb 2018 18:22:24 +0300 Subject: [PATCH 131/149] Add flag to interrupt script if error --- image/image-config.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/image/image-config.sh b/image/image-config.sh index 7ed9c1ec..6a60bfc5 100755 --- a/image/image-config.sh +++ b/image/image-config.sh @@ -1,6 +1,8 @@ #!/bin/bash #!/bin/sh +set -e + # # Script for image configure # @smirart Smirnov Artem From 99e018bf39f60f923645e7770bd1cd3a3a6da1b2 Mon Sep 17 00:00:00 2001 From: urpylka Date: Thu, 8 Feb 2018 20:36:30 +0300 Subject: [PATCH 132/149] Add disable 'set -e' in resize_fs() --- image/image-config.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/image/image-config.sh b/image/image-config.sh index 6a60bfc5..3baa9a5d 100755 --- a/image/image-config.sh +++ b/image/image-config.sh @@ -48,6 +48,8 @@ resize_fs() { # STATIC # TEMPLATE: resize_fs $SIZE $JENKINS_HOME $IMAGE_NAME $DEV_ROOTFS + set +e + # https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D1%91%D0%BD%D0%BD%D1%8B%D0%B9_%D1%84%D0%B0%D0%B9%D0%BB # https://raspberrypi.stackexchange.com/questions/13137/how-can-i-mount-a-raspberry-pi-linux-distro-image @@ -76,6 +78,8 @@ resize_fs() { && resize2fs $4 \ && echo -e "\033[0;31m\033[1mUmount loop-image\033[0m\033[0m" \ && losetup -d $DEV_IMAGE + + set -e } publish_image() { From c56d12c9eee896c9be47bc79249954791e3e94f1 Mon Sep 17 00:00:00 2001 From: urpylka Date: Fri, 9 Feb 2018 21:30:04 +0300 Subject: [PATCH 133/149] Replace $JENKINS_HOME to $BUILD_DIRECTORY --- image/Jenkinsfile | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/image/Jenkinsfile b/image/Jenkinsfile index bbb59ba9..5ad1f845 100644 --- a/image/Jenkinsfile +++ b/image/Jenkinsfile @@ -9,7 +9,7 @@ pipeline { RPI_IMAGE_NAME = '2017-11-29-raspbian-stretch-lite.img' } steps { - sh '$WORKSPACE/image/image-config.sh get_image $JENKINS_HOME $RPI_ZIP_NAME $RPI_DONWLOAD_URL $RPI_IMAGE_NAME $IMAGE_NAME' + sh '$WORKSPACE/image/image-config.sh get_image $BUID_DIRECTORY $RPI_ZIP_NAME $RPI_DONWLOAD_URL $RPI_IMAGE_NAME $IMAGE_NAME' } } stage('Resize FS') { @@ -17,7 +17,7 @@ pipeline { SIZE = '7G' } steps { - sh '$WORKSPACE/image/image-config.sh resize_fs $SIZE $JENKINS_HOME $IMAGE_NAME $DEV_ROOTFS' + sh '$WORKSPACE/image/image-config.sh resize_fs $SIZE $BUID_DIRECTORY $IMAGE_NAME $DEV_ROOTFS' } } stage('Configure interfaces') { @@ -25,7 +25,7 @@ pipeline { EXECUTE_FILE = 'iface.sh' } steps { - sh '$WORKSPACE/image/image-config.sh execute $JENKINS_HOME/$IMAGE_NAME $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $WORKSPACE/image/$EXECUTE_FILE' + sh '$WORKSPACE/image/image-config.sh execute $BUID_DIRECTORY/$IMAGE_NAME $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $WORKSPACE/image/$EXECUTE_FILE' } } stage('Install Apps') { @@ -33,7 +33,7 @@ pipeline { EXECUTE_FILE = 'apps.sh' } steps { - sh '$WORKSPACE/image/image-config.sh execute $JENKINS_HOME/$IMAGE_NAME $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $WORKSPACE/image/$EXECUTE_FILE' + sh '$WORKSPACE/image/image-config.sh execute $BUID_DIRECTORY/$IMAGE_NAME $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $WORKSPACE/image/$EXECUTE_FILE' } } stage('Install ROS') { @@ -41,7 +41,7 @@ pipeline { EXECUTE_FILE = 'ros.sh' } steps { - sh '$WORKSPACE/image/image-config.sh execute $JENKINS_HOME/$IMAGE_NAME $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $WORKSPACE/image/$EXECUTE_FILE' + sh '$WORKSPACE/image/image-config.sh execute $BUID_DIRECTORY/$IMAGE_NAME $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $WORKSPACE/image/$EXECUTE_FILE' } } stage('Publish image') { @@ -49,11 +49,12 @@ pipeline { CONFIG_FILE = 'coex-ci.conf' } steps { - sh '$WORKSPACE/image/image-config.sh publish_image $JENKINS_HOME $IMAGE_NAME $WORKSPACE $CONFIG_FILE $RELEASE_ID $RELEASE_BODY' + sh '$WORKSPACE/image/image-config.sh publish_image $BUID_DIRECTORY $IMAGE_NAME $WORKSPACE $CONFIG_FILE $RELEASE_ID $RELEASE_BODY' } } } environment { + BUID_DIRECTORY = '/home/pi/clever_builder/temp' PREFIX_PATH = '/mnt' DEV_BOOT = '/dev/disk/by-uuid/CDD4-B453' DEV_ROOTFS = '/dev/disk/by-uuid/72bfc10d-73ec-4d9e-a54a-1cc507ee7ed2' From 5fe66fd83a0a4099c8c0783f53e9e50612adc168 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Sat, 10 Feb 2018 04:19:45 +0300 Subject: [PATCH 134/149] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index de835b64..03cd2085 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ https://copterexpress.gitbooks.io/clever/content/ -**Готовый образ** для RPi 3 с предустановленным и преднастроенным clever_bundle можно скачать [здесь](https://copterexpress.gitbooks.io/clever/content/docs/microsd_images.html). +**Готовый образ ОС** для RPi 3 с предустановленным и преднастроенным ПО можно скачать [здесь](https://copterexpress.gitbooks.io/clever/content/docs/microsd_images.html). [Описание API](https://copterexpress.gitbooks.io/clever/content/docs/simple_offboard.html) для автономных полетов. From 1ef71c19616996ab093700fad33029367d2b046b Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Sat, 10 Feb 2018 04:20:35 +0300 Subject: [PATCH 135/149] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 03cd2085..4cfb7231 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ https://copterexpress.gitbooks.io/clever/content/ [Описание API](https://copterexpress.gitbooks.io/clever/content/docs/simple_offboard.html) для автономных полетов. -Установка +Ручная установка --------- Склонировать репозиторий в папку `/home/pi/catkin_ws/src/clever` (**важно**): From 969aa980c8b8d44a35e04daa74685989c209228b Mon Sep 17 00:00:00 2001 From: urpylka Date: Sat, 10 Feb 2018 20:31:17 +0300 Subject: [PATCH 136/149] Replace apt to apt-get --- image/ros.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/image/ros.sh b/image/ros.sh index 897de908..2848fdd3 100755 --- a/image/ros.sh +++ b/image/ros.sh @@ -16,7 +16,7 @@ echo -e "\033[0;31m\033[1m$(date) | #1 Install dirmngr & add key to apt-key\033[ # по умолчанию dirmngr отсуствует на образе и требуется для установки ключа # http://wpblogger.su/tags/apt/ -apt install dirmngr +apt-get install dirmngr # setup keys apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116 @@ -29,7 +29,7 @@ echo "deb http://packages.ros.org/ros/ubuntu stretch main" > /etc/apt/sources.li echo -e "\033[0;31m\033[1m$(date) | #2 apt update && apt upgrade\033[0m\033[0m" # install bootstrap tools -apt update +apt-get update # && apt upgrade -y From 6245d3bfec8681d0d87d20262227fb273e798477 Mon Sep 17 00:00:00 2001 From: urpylka Date: Tue, 13 Feb 2018 19:09:51 +0300 Subject: [PATCH 137/149] Add -f option for umount --- image/image-config.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/image/image-config.sh b/image/image-config.sh index 3baa9a5d..bc7df212 100755 --- a/image/image-config.sh +++ b/image/image-config.sh @@ -251,7 +251,7 @@ umount_system() { # TEMPLATE: umount_system $PREFIX_PATH echo -e "\033[0;31m\033[1m$(date) | Umount recursive dirs: $1\033[0m\033[0m" - umount -R $1 + umount -fR $1 echo -e "\033[0;31m\033[1m$(date) | Umount loop-image\033[0m\033[0m" losetup -d $DEV_IMAGE } @@ -262,7 +262,7 @@ umount_system2() { # TEMPLATE: umount_system $PREFIX_PATH echo -e "\033[0;31m\033[1m$(date) | Umount recursive dirs: $1\033[0m\033[0m" - umount -R $1 + umount -fR $1 echo -e "\033[0;31m\033[1m$(date) | Umount loop-image\033[0m\033[0m" losetup -D } @@ -488,4 +488,4 @@ case "$1" in *) echo "Enter one of: enter, get_image, resize_fs, publish_image, execute";; -esac \ No newline at end of file +esac From 9e5eec4e3bdb3942e1bb131ba87db00d0df22405 Mon Sep 17 00:00:00 2001 From: yuliya1404 Date: Sun, 18 Feb 2018 17:53:48 +0000 Subject: [PATCH 138/149] Updates docs/simple_offboard.md Auto commit by GitBook Editor --- docs/simple_offboard.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/simple_offboard.md b/docs/simple_offboard.md index 689d26dc..55b64768 100644 --- a/docs/simple_offboard.md +++ b/docs/simple_offboard.md @@ -111,25 +111,25 @@ rosservice call /get_telemetry "{frame_id: ''}" ```python # плавно взлететь на высоту 1.5 м со скоростью взлета 0.5 м/с -navigate(0, 0, 1.5, speed=0.5, frame_id='fcu_horiz', auto_arm=True) +navigate(x=0, y=0, z=1.5, speed=0.5, frame_id='fcu_horiz', auto_arm=True) ``` ```python # прилететь по прямой в точку 5:0 (высота 2) # в локальной системе координат со скоростью 0.8 м/с -navigate(5, 0, 3, speed=0.8) +navigate(x=5, y=0, z=3, speed=0.8) ``` ```python # пролететь вправо относительно коптера на 3 м -navigate(0, -1, 0, speed=1, frame_id='fcu_horiz') +navigate(x=0, y=-1, z=0, speed=1, frame_id='fcu_horiz') ``` ```python # прилететь в точку 3:2 (высота 2) в системе координат маркерного поля # со скоростью 1 м/с -navigate(3, 2, 2, speed=1, frame_id='aruco_map', update_frame=True) +navigate(x=3, y=2, z=2, speed=1, frame_id='aruco_map', update_frame=True) ``` Пример взлета на коптере на 2 метра из командной строки: From 05aa5cc8c1d648d11501ee87434e60ceb830538e Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Mon, 19 Feb 2018 01:10:17 +0300 Subject: [PATCH 139/149] Add vim to apps --- image/apps.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/image/apps.sh b/image/apps.sh index 459349dc..6a6139e6 100755 --- a/image/apps.sh +++ b/image/apps.sh @@ -24,7 +24,8 @@ apt-get install --no-install-recommends -y \ python-pip \ git \ isc-dhcp-server \ - tmux + tmux \ + vim From 1db6453fd22ea6486781c28019e3a7bc4f027a40 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Mon, 19 Feb 2018 01:19:54 +0300 Subject: [PATCH 140/149] Update simple_offboard.md --- docs/simple_offboard.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/simple_offboard.md b/docs/simple_offboard.md index 55b64768..2695b192 100644 --- a/docs/simple_offboard.md +++ b/docs/simple_offboard.md @@ -63,7 +63,7 @@ release = rospy.ServiceProxy('/release', Trigger) ### get_telemetry -Получить полную телеметрию коптеру. Параметр: `frame_id` – фрейм для значений `x`, `y`, `z`, `vx`, `vy`, `vz`. Пример: `local_origin`, `fcu_horiz`, `aruco_map`. +Получить полную телеметрию коптера. Параметр: `frame_id` – фрейм для значений `x`, `y`, `z`, `vx`, `vy`, `vz`. Пример: `local_origin`, `fcu_horiz`, `aruco_map`. Ответ: From ba21ed7cf9ea979ede8b80108f0a6fc727a57f66 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Mon, 19 Feb 2018 05:15:48 +0300 Subject: [PATCH 141/149] Update README.md --- README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4cfb7231..1b613597 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,16 @@ https://copterexpress.gitbooks.io/clever/content/ -**Готовый образ ОС** для RPi 3 с предустановленным и преднастроенным ПО можно скачать [здесь](https://copterexpress.gitbooks.io/clever/content/docs/microsd_images.html). +**Образ ОС** для RPi 3 с предустановленным и преднастроенным ПО можно скачать [здесь](https://copterexpress.gitbooks.io/clever/content/docs/microsd_images.html). + +Образ включает в себя: + +* Raspbian Stretch +* ROS Kinetic +* Настроенную работу с сетью +* OpenCV +* mavros +* Набор ПО для работы с Клевером [Описание API](https://copterexpress.gitbooks.io/clever/content/docs/simple_offboard.html) для автономных полетов. From 5ccf4fac48ef03a464c1aacf990eac59c4b4c4a2 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Mon, 19 Feb 2018 05:17:38 +0300 Subject: [PATCH 142/149] Update README.md --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1b613597..57978ead 100644 --- a/README.md +++ b/README.md @@ -32,11 +32,13 @@ https://copterexpress.gitbooks.io/clever/content/ Ручная установка --------- -Склонировать репозиторий в папку `/home/pi/catkin_ws/src/clever` (**важно**): +Установить ROS Kinetic согласно [инструкциям](http://wiki.ros.org/kinetic/Installation). + +Склонировать репозиторий в папку `/home/pi/catkin_ws/src/clever`: ```bash cd ~/catkin_ws/src -git clone https://github.com/CopterExpress/clever_bundle.git clever +git clone https://github.com/CopterExpress/clever.git clever ``` Пересобрать ROS-пакеты: From 431b97a01119cc8a396218aca4904f3cfd20be6b Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Mon, 19 Feb 2018 06:38:24 +0300 Subject: [PATCH 143/149] Add mobile remote control for iOS --- apps/ios/.gitignore | 17 + apps/ios/Podfile | 14 + apps/ios/Podfile.lock | 21 + apps/ios/cleverrc.xcodeproj/project.pbxproj | 444 ++ .../contents.xcworkspacedata | 7 + .../contents.xcworkspacedata | 10 + apps/ios/cleverrc/AppDelegate.swift | 46 + .../AppIcon.appiconset/Contents.json | 100 + .../AppIcon.appiconset/cleverios180-1.png | Bin 0 -> 3344 bytes .../AppIcon.appiconset/cleverios180.png | Bin 0 -> 3344 bytes .../cleverrc/Assets.xcassets/Contents.json | 6 + .../Image.imageset/Contents.json | 20 + .../Base.lproj/LaunchScreen.storyboard | 29 + apps/ios/cleverrc/Base.lproj/Main.storyboard | 46 + apps/ios/cleverrc/BinUtils.swift | 453 ++ apps/ios/cleverrc/Info.plist | 46 + apps/ios/cleverrc/ViewController.swift | 70 + apps/ios/cleverrc/clever.svg | 84 + apps/ios/cleverrc/index.html | 23 + apps/ios/cleverrc/main.css | 91 + apps/ios/cleverrc/main.js | 126 + apps/ios/cleverrc/roslib.js | 3693 +++++++++++++++++ apps/ios/cleverrc/telemetry.js | 85 + clever/CMakeLists.txt | 5 +- clever/launch/clever.launch | 3 + clever/launch/mavros.launch | 1 - clever/src/rc.cpp | 118 + 27 files changed, 5556 insertions(+), 2 deletions(-) create mode 100644 apps/ios/.gitignore create mode 100644 apps/ios/Podfile create mode 100644 apps/ios/Podfile.lock create mode 100644 apps/ios/cleverrc.xcodeproj/project.pbxproj create mode 100644 apps/ios/cleverrc.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 apps/ios/cleverrc.xcworkspace/contents.xcworkspacedata create mode 100644 apps/ios/cleverrc/AppDelegate.swift create mode 100644 apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/cleverios180-1.png create mode 100644 apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/cleverios180.png create mode 100644 apps/ios/cleverrc/Assets.xcassets/Contents.json create mode 100644 apps/ios/cleverrc/Assets.xcassets/Image.imageset/Contents.json create mode 100644 apps/ios/cleverrc/Base.lproj/LaunchScreen.storyboard create mode 100644 apps/ios/cleverrc/Base.lproj/Main.storyboard create mode 100644 apps/ios/cleverrc/BinUtils.swift create mode 100644 apps/ios/cleverrc/Info.plist create mode 100644 apps/ios/cleverrc/ViewController.swift create mode 100644 apps/ios/cleverrc/clever.svg create mode 100644 apps/ios/cleverrc/index.html create mode 100644 apps/ios/cleverrc/main.css create mode 100644 apps/ios/cleverrc/main.js create mode 100644 apps/ios/cleverrc/roslib.js create mode 100644 apps/ios/cleverrc/telemetry.js create mode 100644 clever/src/rc.cpp diff --git a/apps/ios/.gitignore b/apps/ios/.gitignore new file mode 100644 index 00000000..db36ad06 --- /dev/null +++ b/apps/ios/.gitignore @@ -0,0 +1,17 @@ +# Xcode +.DS_Store +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +!default.xcworkspace +xcuserdata +profile +*.moved-aside +DerivedData +Pods/ diff --git a/apps/ios/Podfile b/apps/ios/Podfile new file mode 100644 index 00000000..2bffe4c7 --- /dev/null +++ b/apps/ios/Podfile @@ -0,0 +1,14 @@ +project 'cleverrc.xcodeproj/' + +# Uncomment the next line to define a global platform for your project +# platform :ios, '9.0' + +target 'cleverrc' do + # Comment the next line if you're not using Swift and don't want to use dynamic frameworks + use_frameworks! + + # Pods for cleverrc + pod 'SwiftSocket', '~> 2.0' + pod 'NotificationBannerSwift' + +end diff --git a/apps/ios/Podfile.lock b/apps/ios/Podfile.lock new file mode 100644 index 00000000..23c9ad41 --- /dev/null +++ b/apps/ios/Podfile.lock @@ -0,0 +1,21 @@ +PODS: + - MarqueeLabel/Swift (3.1.4) + - NotificationBannerSwift (1.5.4): + - MarqueeLabel/Swift + - SnapKit (~> 4.0) + - SnapKit (4.0.0) + - SwiftSocket (2.0.2) + +DEPENDENCIES: + - NotificationBannerSwift + - SwiftSocket (~> 2.0) + +SPEC CHECKSUMS: + MarqueeLabel: bf768455fe88d427f71476ebb23f9092b660f40b + NotificationBannerSwift: 4f6666c8421dcf11be0812dd1093d932c15921af + SnapKit: a42d492c16e80209130a3379f73596c3454b7694 + SwiftSocket: 6f4c9c63fbc5c1d61188936bb3c599fd546f40ae + +PODFILE CHECKSUM: fd5199f69c3ee8c1fbc0dd582477d890c8b2a24f + +COCOAPODS: 1.4.0 diff --git a/apps/ios/cleverrc.xcodeproj/project.pbxproj b/apps/ios/cleverrc.xcodeproj/project.pbxproj new file mode 100644 index 00000000..4fa29e7c --- /dev/null +++ b/apps/ios/cleverrc.xcodeproj/project.pbxproj @@ -0,0 +1,444 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 48; + objects = { + +/* Begin PBXBuildFile section */ + 7C0AB7AB202A744400BAED27 /* BinUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C0AB7AA202A744400BAED27 /* BinUtils.swift */; }; + 7C51654120139237004D1F4D /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C51654020139237004D1F4D /* AppDelegate.swift */; }; + 7C51654320139237004D1F4D /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C51654220139237004D1F4D /* ViewController.swift */; }; + 7C51654620139237004D1F4D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7C51654420139237004D1F4D /* Main.storyboard */; }; + 7C51654820139237004D1F4D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7C51654720139237004D1F4D /* Assets.xcassets */; }; + 7C51654B20139237004D1F4D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7C51654920139237004D1F4D /* LaunchScreen.storyboard */; }; + 7C516553201526BA004D1F4D /* index.html in Resources */ = {isa = PBXBuildFile; fileRef = 7C516552201526BA004D1F4D /* index.html */; }; + 7C51655520153180004D1F4D /* main.js in Resources */ = {isa = PBXBuildFile; fileRef = 7C51655420153180004D1F4D /* main.js */; }; + 7CA401E22033CE17009FAA3B /* main.css in Resources */ = {isa = PBXBuildFile; fileRef = 7CA401E12033CE17009FAA3B /* main.css */; }; + 7CA401E42033FA34009FAA3B /* telemetry.js in Resources */ = {isa = PBXBuildFile; fileRef = 7CA401E32033FA34009FAA3B /* telemetry.js */; }; + 7CA401E6203471D9009FAA3B /* clever.svg in Resources */ = {isa = PBXBuildFile; fileRef = 7CA401E5203471D8009FAA3B /* clever.svg */; }; + C25141CAF1A7125F3CE29DDC /* Pods_cleverrc.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C38C04523251039FF13DDCD /* Pods_cleverrc.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 5C38C04523251039FF13DDCD /* Pods_cleverrc.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_cleverrc.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 7C0AB7AA202A744400BAED27 /* BinUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BinUtils.swift; sourceTree = ""; }; + 7C45DCE9203A75A2009C73F5 /* roslib.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = roslib.js; sourceTree = ""; }; + 7C51653D20139237004D1F4D /* cleverrc.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = cleverrc.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 7C51654020139237004D1F4D /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7C51654220139237004D1F4D /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 7C51654520139237004D1F4D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 7C51654720139237004D1F4D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 7C51654A20139237004D1F4D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 7C51654C20139237004D1F4D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 7C516552201526BA004D1F4D /* index.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = index.html; sourceTree = ""; }; + 7C51655420153180004D1F4D /* main.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = main.js; sourceTree = ""; }; + 7CA401E12033CE17009FAA3B /* main.css */ = {isa = PBXFileReference; lastKnownFileType = text.css; path = main.css; sourceTree = ""; }; + 7CA401E32033FA34009FAA3B /* telemetry.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = telemetry.js; sourceTree = ""; }; + 7CA401E5203471D8009FAA3B /* clever.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = clever.svg; sourceTree = ""; }; + AAC9195BF3A9BF6942EF4D0B /* Pods-cleverrc.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-cleverrc.release.xcconfig"; path = "Pods/Target Support Files/Pods-cleverrc/Pods-cleverrc.release.xcconfig"; sourceTree = ""; }; + CB200F4B933204EA97E0E2E4 /* Pods-cleverrc.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-cleverrc.debug.xcconfig"; path = "Pods/Target Support Files/Pods-cleverrc/Pods-cleverrc.debug.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 7C51653A20139237004D1F4D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C25141CAF1A7125F3CE29DDC /* Pods_cleverrc.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 4FA3968F2242239E15A656D2 /* Pods */ = { + isa = PBXGroup; + children = ( + CB200F4B933204EA97E0E2E4 /* Pods-cleverrc.debug.xcconfig */, + AAC9195BF3A9BF6942EF4D0B /* Pods-cleverrc.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; + 66C638F0021EBE07741B26F3 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 5C38C04523251039FF13DDCD /* Pods_cleverrc.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 7C51653420139237004D1F4D = { + isa = PBXGroup; + children = ( + 66C638F0021EBE07741B26F3 /* Frameworks */, + 4FA3968F2242239E15A656D2 /* Pods */, + 7C51653E20139237004D1F4D /* Products */, + 7C51653F20139237004D1F4D /* cleverrc */, + ); + sourceTree = ""; + }; + 7C51653E20139237004D1F4D /* Products */ = { + isa = PBXGroup; + children = ( + 7C51653D20139237004D1F4D /* cleverrc.app */, + ); + name = Products; + sourceTree = ""; + }; + 7C51653F20139237004D1F4D /* cleverrc */ = { + isa = PBXGroup; + children = ( + 7C45DCE9203A75A2009C73F5 /* roslib.js */, + 7C51654020139237004D1F4D /* AppDelegate.swift */, + 7C51654720139237004D1F4D /* Assets.xcassets */, + 7C0AB7AA202A744400BAED27 /* BinUtils.swift */, + 7C51654C20139237004D1F4D /* Info.plist */, + 7C51654920139237004D1F4D /* LaunchScreen.storyboard */, + 7C51654420139237004D1F4D /* Main.storyboard */, + 7C51654220139237004D1F4D /* ViewController.swift */, + 7CA401E5203471D8009FAA3B /* clever.svg */, + 7C516552201526BA004D1F4D /* index.html */, + 7CA401E12033CE17009FAA3B /* main.css */, + 7C51655420153180004D1F4D /* main.js */, + 7CA401E32033FA34009FAA3B /* telemetry.js */, + ); + path = cleverrc; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 7C51653C20139237004D1F4D /* cleverrc */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7C51654F20139237004D1F4D /* Build configuration list for PBXNativeTarget "cleverrc" */; + buildPhases = ( + 9F096121C4A02BCE9D4FD1B9 /* [CP] Check Pods Manifest.lock */, + 7C51653920139237004D1F4D /* Sources */, + 7C51653A20139237004D1F4D /* Frameworks */, + 7C51653B20139237004D1F4D /* Resources */, + A37DBBAD5E44E632F8A8A204 /* [CP] Embed Pods Frameworks */, + 9BAB41D26FC0095C7C86B9DE /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = cleverrc; + productName = cleverrc; + productReference = 7C51653D20139237004D1F4D /* cleverrc.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 7C51653520139237004D1F4D /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 0920; + ORGANIZATIONNAME = "Copter Express"; + TargetAttributes = { + 7C51653C20139237004D1F4D = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 7C51653820139237004D1F4D /* Build configuration list for PBXProject "cleverrc" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 7C51653420139237004D1F4D; + productRefGroup = 7C51653E20139237004D1F4D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 7C51653C20139237004D1F4D /* cleverrc */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 7C51653B20139237004D1F4D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7C51654B20139237004D1F4D /* LaunchScreen.storyboard in Resources */, + 7CA401E6203471D9009FAA3B /* clever.svg in Resources */, + 7CA401E42033FA34009FAA3B /* telemetry.js in Resources */, + 7C516553201526BA004D1F4D /* index.html in Resources */, + 7C51654820139237004D1F4D /* Assets.xcassets in Resources */, + 7CA401E22033CE17009FAA3B /* main.css in Resources */, + 7C51654620139237004D1F4D /* Main.storyboard in Resources */, + 7C51655520153180004D1F4D /* main.js in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 9BAB41D26FC0095C7C86B9DE /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-cleverrc/Pods-cleverrc-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 9F096121C4A02BCE9D4FD1B9 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-cleverrc-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + A37DBBAD5E44E632F8A8A204 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${SRCROOT}/Pods/Target Support Files/Pods-cleverrc/Pods-cleverrc-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/MarqueeLabel/MarqueeLabel.framework", + "${BUILT_PRODUCTS_DIR}/NotificationBannerSwift/NotificationBannerSwift.framework", + "${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework", + "${BUILT_PRODUCTS_DIR}/SwiftSocket/SwiftSocket.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MarqueeLabel.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/NotificationBannerSwift.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SnapKit.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftSocket.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-cleverrc/Pods-cleverrc-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 7C51653920139237004D1F4D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7C51654320139237004D1F4D /* ViewController.swift in Sources */, + 7C51654120139237004D1F4D /* AppDelegate.swift in Sources */, + 7C0AB7AB202A744400BAED27 /* BinUtils.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 7C51654420139237004D1F4D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 7C51654520139237004D1F4D /* Base */, + ); + name = Main.storyboard; + path = .; + sourceTree = ""; + }; + 7C51654920139237004D1F4D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 7C51654A20139237004D1F4D /* Base */, + ); + name = LaunchScreen.storyboard; + path = .; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 7C51654D20139237004D1F4D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.2; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 7C51654E20139237004D1F4D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.2; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 7C51655020139237004D1F4D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = CB200F4B933204EA97E0E2E4 /* Pods-cleverrc.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 7QY6KJ2672; + INFOPLIST_FILE = cleverrc/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = coex.cleverrc; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 7C51655120139237004D1F4D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = AAC9195BF3A9BF6942EF4D0B /* Pods-cleverrc.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 7QY6KJ2672; + INFOPLIST_FILE = cleverrc/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = coex.cleverrc; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 7C51653820139237004D1F4D /* Build configuration list for PBXProject "cleverrc" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7C51654D20139237004D1F4D /* Debug */, + 7C51654E20139237004D1F4D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7C51654F20139237004D1F4D /* Build configuration list for PBXNativeTarget "cleverrc" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7C51655020139237004D1F4D /* Debug */, + 7C51655120139237004D1F4D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 7C51653520139237004D1F4D /* Project object */; +} diff --git a/apps/ios/cleverrc.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/apps/ios/cleverrc.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..a82027a8 --- /dev/null +++ b/apps/ios/cleverrc.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/apps/ios/cleverrc.xcworkspace/contents.xcworkspacedata b/apps/ios/cleverrc.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..e6d7f535 --- /dev/null +++ b/apps/ios/cleverrc.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/apps/ios/cleverrc/AppDelegate.swift b/apps/ios/cleverrc/AppDelegate.swift new file mode 100644 index 00000000..981c369a --- /dev/null +++ b/apps/ios/cleverrc/AppDelegate.swift @@ -0,0 +1,46 @@ +// +// AppDelegate.swift +// cleverrc +// +// Created by Oleg Kalachev on 20.01.2018. +// Copyright © 2018 Copter Express. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(_ application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(_ application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(_ application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(_ application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/Contents.json b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..dbbe908d --- /dev/null +++ b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,100 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "cleverios180.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "cleverios180-1.png", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/cleverios180-1.png b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/cleverios180-1.png new file mode 100644 index 0000000000000000000000000000000000000000..ae590b79e3ed6c0b512d0dc88fc9ea4bf7687021 GIT binary patch literal 3344 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 TNAli895P)kxF%ZN@!7utxT#&9 literal 0 HcmV?d00001 diff --git a/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/cleverios180.png b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/cleverios180.png new file mode 100644 index 0000000000000000000000000000000000000000..ae590b79e3ed6c0b512d0dc88fc9ea4bf7687021 GIT binary patch literal 3344 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 TNAli895P)kxF%ZN@!7utxT#&9 literal 0 HcmV?d00001 diff --git a/apps/ios/cleverrc/Assets.xcassets/Contents.json b/apps/ios/cleverrc/Assets.xcassets/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/apps/ios/cleverrc/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/apps/ios/cleverrc/Assets.xcassets/Image.imageset/Contents.json b/apps/ios/cleverrc/Assets.xcassets/Image.imageset/Contents.json new file mode 100644 index 00000000..f8f827e4 --- /dev/null +++ b/apps/ios/cleverrc/Assets.xcassets/Image.imageset/Contents.json @@ -0,0 +1,20 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/apps/ios/cleverrc/Base.lproj/LaunchScreen.storyboard b/apps/ios/cleverrc/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..19d54bf0 --- /dev/null +++ b/apps/ios/cleverrc/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/ios/cleverrc/Base.lproj/Main.storyboard b/apps/ios/cleverrc/Base.lproj/Main.storyboard new file mode 100644 index 00000000..0afff7f1 --- /dev/null +++ b/apps/ios/cleverrc/Base.lproj/Main.storyboard @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/ios/cleverrc/BinUtils.swift b/apps/ios/cleverrc/BinUtils.swift new file mode 100644 index 00000000..422cd7c3 --- /dev/null +++ b/apps/ios/cleverrc/BinUtils.swift @@ -0,0 +1,453 @@ +// +// BinUtils.swift +// BinUtils +// +// Created by Nicolas Seriot on 12/03/16. +// Copyright © 2016 Nicolas Seriot. All rights reserved. +// + +import Foundation +import CoreFoundation + +// MARK: protocol UnpackedType + +public protocol Unpackable {} + +extension NSString: Unpackable {} +extension Bool: Unpackable {} +extension Int: Unpackable {} +extension Double: Unpackable {} + +// MARK: protocol DataConvertible + +protocol DataConvertible {} + +extension DataConvertible { + + init?(data: Data) { + guard data.count == MemoryLayout.size else { return nil } + self = data.withUnsafeBytes { $0.pointee } + } + + init?(bytes: [UInt8]) { + let data = Data(bytes:bytes) + self.init(data:data) + } + + var data: Data { + var value = self + return Data(buffer: UnsafeBufferPointer(start: &value, count: 1)) + } +} + +extension Bool : DataConvertible { } + +extension Int8 : DataConvertible { } +extension Int16 : DataConvertible { } +extension Int32 : DataConvertible { } +extension Int64 : DataConvertible { } + +extension UInt8 : DataConvertible { } +extension UInt16 : DataConvertible { } +extension UInt32 : DataConvertible { } +extension UInt64 : DataConvertible { } + +extension Float32 : DataConvertible { } +extension Float64 : DataConvertible { } + +// MARK: String extension + +extension String { + subscript (from:Int, to:Int) -> String { + return NSString(string: self).substring(with: NSMakeRange(from, to-from)) + } +} + +// MARK: Data extension + +extension Data { + var bytes : [UInt8] { + return self.withUnsafeBytes { + [UInt8](UnsafeBufferPointer(start: $0, count: self.count)) + } + } +} + +// MARK: functions + +public func hexlify(_ data:Data) -> String { + + // similar to hexlify() in Python's binascii module + // https://docs.python.org/2/library/binascii.html + + var s = String() + var byte: UInt8 = 0 + + for i in 0 ..< data.count { + NSData(data: data).getBytes(&byte, range: NSMakeRange(i, 1)) + s = s.appendingFormat("%02x", byte) + } + + return s as String +} + +public func unhexlify(_ string:String) -> Data? { + + // similar to unhexlify() in Python's binascii module + // https://docs.python.org/2/library/binascii.html + + let s = string.uppercased().replacingOccurrences(of: " ", with: "") + + let nonHexCharacterSet = CharacterSet(charactersIn: "0123456789ABCDEF").inverted + if let range = s.rangeOfCharacter(from: nonHexCharacterSet) { + print("-- found non hex character at range \(range)") + return nil + } + + var data = Data(capacity: s.count / 2) + + for i in stride(from: 0, to:s.count, by:2) { + let byteString = s[i, i+2] + let byte = UInt8(byteString.withCString { strtoul($0, nil, 16) }) + data.append([byte] as [UInt8], count: 1) + } + + return data +} + +func readIntegerType(_ type:T.Type, bytes:[UInt8], loc:inout Int) -> T { + let size = MemoryLayout.size + let sub = Array(bytes[loc..<(loc+size)]) + loc += size + return T(bytes: sub)! +} + +func readFloatingPointType(_ type:T.Type, bytes:[UInt8], loc:inout Int, isBigEndian:Bool) -> T { + let size = MemoryLayout.size + let sub = Array(bytes[loc..<(loc+size)]) + loc += size + let sub_ = isBigEndian ? sub.reversed() : sub + return T(bytes: sub_)! +} + +func isBigEndianFromMandatoryByteOrderFirstCharacter(_ format:String) -> Bool { + + guard let firstChar = format.first else { assertionFailure("empty format"); return false } + + let s = NSString(string: String(firstChar)) + let c = s.substring(to: 1) + + if c == "@" { assertionFailure("native size and alignment is unsupported") } + + if c == "=" || c == "<" { return false } + if c == ">" || c == "!" { return true } + + assertionFailure("format '\(format)' first character must be among '=<>!'") + + return false +} + +// akin to struct.calcsize(fmt) +func numberOfBytesInFormat(_ format:String) -> Int { + + var numberOfBytes = 0 + + var n = 0 // repeat counter + + var mutableFormat = format + + while !mutableFormat.isEmpty { + + let c = mutableFormat.remove(at: mutableFormat.startIndex) + + if let i = Int(String(c)) , 0...9 ~= i { + if n > 0 { n *= 10 } + n += i + continue + } + + if c == "s" { + numberOfBytes += max(n,1) + n = 0 + continue + } + + for _ in 0..", "!", " ": + () + case "c", "b", "B", "x", "?": + numberOfBytes += 1 + case "h", "H": + numberOfBytes += 2 + case "i", "l", "I", "L", "f": + numberOfBytes += 4 + case "q", "Q", "d": + numberOfBytes += 8 + case "P": + numberOfBytes += MemoryLayout.size + default: + assertionFailure("-- unsupported format \(c)") + } + } + + n = 0 + } + + return numberOfBytes +} + +func formatDoesMatchDataLength(_ format:String, data:Data) -> Bool { + let sizeAccordingToFormat = numberOfBytesInFormat(format) + let dataLength = data.count + if sizeAccordingToFormat != dataLength { + print("format \"\(format)\" expects \(sizeAccordingToFormat) bytes but data is \(dataLength) bytes") + return false + } + + return true +} + +/* + pack() and unpack() should behave as Python's struct module https://docs.python.org/2/library/struct.html BUT: + - native size and alignment '@' is not supported + - as a consequence, the byte order specifier character is mandatory and must be among "=<>!" + - native byte order '=' assumes a little-endian system (eg. Intel x86) + - Pascal strings 'p' and native pointers 'P' are not supported + */ + +public enum BinUtilsError: Error { + case formatDoesMatchDataLength(format:String, dataSize:Int) + case unsupportedFormat(character:Character) +} + +public func pack(_ format:String, _ objects:[Any], _ stringEncoding:String.Encoding=String.Encoding.windowsCP1252) -> Data { + + var objectsQueue = objects + + var mutableFormat = format + + var mutableData = Data() + + var isBigEndian = false + + let firstCharacter = mutableFormat.remove(at: mutableFormat.startIndex) + + switch(firstCharacter) { + case "<", "=": + isBigEndian = false + case ">", "!": + isBigEndian = true + case "@": + assertionFailure("native size and alignment '@' is unsupported'") + default: + assertionFailure("unsupported format chacracter'") + } + + var n = 0 // repeat counter + + while !mutableFormat.isEmpty { + + let c = mutableFormat.remove(at: mutableFormat.startIndex) + + if let i = Int(String(c)) , 0...9 ~= i { + if n > 0 { n *= 10 } + n += i + continue + } + + var o : Any = 0 + + if c == "s" { + o = objectsQueue.remove(at: 0) + + guard let stringData = (o as! String).data(using: .utf8) else { assertionFailure(); return Data() } + var bytes = stringData.bytes + + let expectedSize = max(1, n) + + // pad ... + while bytes.count < expectedSize { bytes.append(0x00) } + + // ... or trunk + if bytes.count > expectedSize { bytes = Array(bytes[0.. [Unpackable] { + + assert(CFByteOrderGetCurrent() == 1 /* CFByteOrderLittleEndian */, "\(#file) assumes little endian, but host is big endian") + + let isBigEndian = isBigEndianFromMandatoryByteOrderFirstCharacter(format) + + if formatDoesMatchDataLength(format, data: data) == false { + throw BinUtilsError.formatDoesMatchDataLength(format:format, dataSize:data.count) + } + + var a : [Unpackable] = [] + + var loc = 0 + + let bytes = data.bytes + + var n = 0 // repeat counter + + var mutableFormat = format + + mutableFormat.remove(at: mutableFormat.startIndex) // consume byte-order specifier + + while !mutableFormat.isEmpty { + + let c = mutableFormat.remove(at: mutableFormat.startIndex) + + if let i = Int(String(c)) , 0...9 ~= i { + if n > 0 { n *= 10 } + n += i + continue + } + + if c == "s" { + let length = max(n,1) + let sub = Array(bytes[loc.. + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Clever RC + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/apps/ios/cleverrc/ViewController.swift b/apps/ios/cleverrc/ViewController.swift new file mode 100644 index 00000000..5eae6b3f --- /dev/null +++ b/apps/ios/cleverrc/ViewController.swift @@ -0,0 +1,70 @@ +// +// ViewController.swift +// cleverrc +// +// Created by Oleg Kalachev on 20.01.2018. +// Copyright © 2018 Copter Express. All rights reserved. +// + +import UIKit +import WebKit +import SwiftSocket +import NotificationBannerSwift + +class ViewController: UIViewController, WKScriptMessageHandler { + @IBOutlet weak var webView: WKWebView! + let impactGenerator = UIImpactFeedbackGenerator(style: .medium) + let notificationGenerator = UINotificationFeedbackGenerator() + let udpSocket = UDPClient(address:"255.255.255.255", port: 35602) + + override func viewDidLoad() { + super.viewDidLoad() + + // Don't lock screen + UIApplication.shared.isIdleTimerDisabled = true + + // Setup webview event handlers + webView.configuration.userContentController.add(self, name: "control") + webView.configuration.userContentController.add(self, name: "controlStart") + webView.configuration.userContentController.add(self, name: "lowBattery") + webView.configuration.userContentController.add(self, name: "notification") + + // Load the main page + let url = Bundle.main.url(forResource: "index", withExtension: "html") + let requestObj = URLRequest(url: url!) + webView.load(requestObj) + + // Setup UDP broadcasting + udpSocket.enableBroadcast() + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { + if (message.name == "control") { + // Send UDP control message + let m = message.body as! NSDictionary; + let d = pack(" + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/ios/cleverrc/index.html b/apps/ios/cleverrc/index.html new file mode 100644 index 00000000..391ef631 --- /dev/null +++ b/apps/ios/cleverrc/index.html @@ -0,0 +1,23 @@ + + + + + + + + +

+
+ +
+
+
+
+
+
+
+
+ + + + diff --git a/apps/ios/cleverrc/main.css b/apps/ios/cleverrc/main.css new file mode 100644 index 00000000..c9a6dc11 --- /dev/null +++ b/apps/ios/cleverrc/main.css @@ -0,0 +1,91 @@ +html, body { + margin: 0; + padding: 0; + user-select: none; + font-family: sans-serif; + background: #212121; + color: rgba(255, 255, 255, 0.9); +} + +.stick { + border-radius: 50%; + width: 5cm; + height: 5cm; + position: relative; + transform: translateZ(0); + border: 4px solid rgba(255,255,255,.4); + box-shadow: 0 0 0 1px rgba(0,0,0,.2), inset 0 0 0 1px rgba(0,0,0,.2); +} + +.stick-pointer { + position: absolute; + border-radius: 50%; + background-color: rgba(255,255,255,.25); + box-shadow: 0 0 10px rgba(0,0,0,.3); + width: 3cm; + height: 3cm; + margin-left: -1.5cm; + margin-top: -1.5cm; + top: 2.5cm; + left: 2.5cm; + pointer-events: none; + transform: translateZ(0); +} + +.container { + display: flex; + justify-content: space-around; + align-items: center; + width: 100%; + height: 100%; +} + +.telemetry { + position: absolute; + text-align: center; + width: 100%; + top: 30px; + font-size: 20px; + user-select: none; + pointer-events: none; +} + +body.armed .telemetry .mode { + font-weight: bold; +} + +@keyframes scale { + 0% { transform: scale(1.0); } + 50% { transform: scale(1.2); } + 100% { transform: scale(1.0); } +} + +.battery { + position: absolute; + text-align: center; + width: 100%; + bottom: 30px; + font-size: 20px; + user-select: none; + pointer-events: none; +} + +body.low-battery .battery { + color: #ff554b; + animation: scale 0.3s 1 ease-in-out} + +.logo { + position: absolute; + background: url(clever.svg); + -webkit-background-size: 50px; + background-size: 50px; + width: 50px; + height: 50px; + top: 50%; + left: 50%; + margin-top: -25px; + margin-left: -25px; + font-size: 20px; + user-select: none; + pointer-events: none; +} diff --git a/apps/ios/cleverrc/main.js b/apps/ios/cleverrc/main.js new file mode 100644 index 00000000..75c94506 --- /dev/null +++ b/apps/ios/cleverrc/main.js @@ -0,0 +1,126 @@ +function throttle(func, ms) { + var isThrottled = false, + savedArgs, + savedThis; + + function wrapper() { + if (isThrottled) { + savedArgs = arguments; + savedThis = this; + return; + } + func.apply(this, arguments); + isThrottled = true; + setTimeout(function() { + isThrottled = false; + if (savedArgs) { + wrapper.apply(savedThis, savedArgs); + savedArgs = savedThis = null; + } + }, ms); + } + return wrapper; +} + +function callNativeApp(name, msg) { + try { + webkit.messageHandlers[name].postMessage(msg); + return true; + } catch(err) { + console.warn('The native context does not exist yet'); + return false; + } +} + +var rcLastPublish = null; + +function rcPublish() { + callNativeApp('control', controlMessage); + rcLastPublish = new Date(); +} + +rcPublishThrottled = throttle(rcPublish, 30); + +setInterval(function() { + if (rcLastPublish !== null && new Date() - rcLastPublish > 800) { + rcPublishThrottled(); + } +}, 50); + +var body = document.querySelector('body'); +var stickLeft = document.querySelector('.stick-left'); +var stickRight = document.querySelector('.stick-right'); + +var controlMessage = { x: 0, y: 0, z: 0, r: 0 }; + +function onStickTouchMove(touch) { + var target = touch.target; + var targetRect = target.getBoundingClientRect(); + var stickPointer = target.querySelector('.stick-pointer'); + + var offsetX = touch.clientX - targetRect.left; + var offsetY = touch.clientY - targetRect.top; + + var x = 2 * offsetX / targetRect.width; + var y = 2 * offsetY / targetRect.height; + + x = Math.max(0, x); + x = Math.min(2, x); + y = Math.max(0, y); + y = Math.min(2, y); + + stickPointer.style.left = (x * 50) + '%'; + stickPointer.style.top = (y * 50) + '%'; + + x -= 1; + y = 1 - y; + + if (target.matches('.stick-left')) { + controlMessage.z = Math.round((y + 1) * 500); + controlMessage.r = Math.round(x * 1000); + } else if (target.matches('.stick-right')) { + controlMessage.x = Math.round(y * 1000); + controlMessage.y = Math.round(x * 1000); + } +} + +body.addEventListener('touchmove', function (e) { + e.preventDefault(); +}); + +function stickTouchStart(e) { + setControlMode(); + callNativeApp('controlStart'); + onStickTouchMove(e.changedTouches[0]); + rcPublishThrottled(); + e.stopPropagation(); + e.preventDefault(); +} + +function stickTouchMove(e) { + onStickTouchMove(e.changedTouches[0]); + rcPublishThrottled(); + e.stopPropagation(); + e.preventDefault(); +} + +function stickTouchEnd(e) { + var pointer = e.target.querySelector('.stick-pointer'); + if (e.target.matches('.stick-left')) { + controlMessage.r = 0; + pointer.style.left = '50%'; + } else if (e.target.matches('.stick-right')) { + controlMessage.x = 0; + controlMessage.y = 0; + pointer.style.left = '50%'; + pointer.style.top = '50%'; + } + rcPublishThrottled(); +} + +stickLeft.addEventListener('touchmove', stickTouchMove); +stickRight.addEventListener('touchmove', stickTouchMove); +stickLeft.addEventListener('touchstart', stickTouchStart); +stickRight.addEventListener('touchstart', stickTouchStart); +stickLeft.addEventListener('touchend', stickTouchEnd); +stickRight.addEventListener('touchend', stickTouchEnd); diff --git a/apps/ios/cleverrc/roslib.js b/apps/ios/cleverrc/roslib.js new file mode 100644 index 00000000..2193da84 --- /dev/null +++ b/apps/ios/cleverrc/roslib.js @@ -0,0 +1,3693 @@ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0 && + tree._listeners.length > this._events.maxListeners + ) { + tree._listeners.warned = true; + logPossibleMemoryLeak.call(this, tree._listeners.length, name); + } + } + return true; + } + name = type.shift(); + } + return true; + } + + // By default EventEmitters will print a warning if more than + // 10 listeners are added to it. This is a useful default which + // helps finding memory leaks. + // + // Obviously not all Emitters should be limited to 10. This function allows + // that to be increased. Set to zero for unlimited. + + EventEmitter.prototype.delimiter = '.'; + + EventEmitter.prototype.setMaxListeners = function(n) { + if (n !== undefined) { + this._events || init.call(this); + this._events.maxListeners = n; + if (!this._conf) this._conf = {}; + this._conf.maxListeners = n; + } + }; + + EventEmitter.prototype.event = ''; + + EventEmitter.prototype.once = function(event, fn) { + this.many(event, 1, fn); + return this; + }; + + EventEmitter.prototype.many = function(event, ttl, fn) { + var self = this; + + if (typeof fn !== 'function') { + throw new Error('many only accepts instances of Function'); + } + + function listener() { + if (--ttl === 0) { + self.off(event, listener); + } + fn.apply(this, arguments); + } + + listener._origin = fn; + + this.on(event, listener); + + return self; + }; + + EventEmitter.prototype.emit = function() { + + this._events || init.call(this); + + var type = arguments[0]; + + if (type === 'newListener' && !this.newListener) { + if (!this._events.newListener) { + return false; + } + } + + var al = arguments.length; + var args,l,i,j; + var handler; + + if (this._all && this._all.length) { + handler = this._all.slice(); + if (al > 3) { + args = new Array(al); + for (j = 0; j < al; j++) args[j] = arguments[j]; + } + + for (i = 0, l = handler.length; i < l; i++) { + this.event = type; + switch (al) { + case 1: + handler[i].call(this, type); + break; + case 2: + handler[i].call(this, type, arguments[1]); + break; + case 3: + handler[i].call(this, type, arguments[1], arguments[2]); + break; + default: + handler[i].apply(this, args); + } + } + } + + if (this.wildcard) { + handler = []; + var ns = typeof type === 'string' ? type.split(this.delimiter) : type.slice(); + searchListenerTree.call(this, handler, ns, this.listenerTree, 0); + } else { + handler = this._events[type]; + if (typeof handler === 'function') { + this.event = type; + switch (al) { + case 1: + handler.call(this); + break; + case 2: + handler.call(this, arguments[1]); + break; + case 3: + handler.call(this, arguments[1], arguments[2]); + break; + default: + args = new Array(al - 1); + for (j = 1; j < al; j++) args[j - 1] = arguments[j]; + handler.apply(this, args); + } + return true; + } else if (handler) { + // need to make copy of handlers because list can change in the middle + // of emit call + handler = handler.slice(); + } + } + + if (handler && handler.length) { + if (al > 3) { + args = new Array(al - 1); + for (j = 1; j < al; j++) args[j - 1] = arguments[j]; + } + for (i = 0, l = handler.length; i < l; i++) { + this.event = type; + switch (al) { + case 1: + handler[i].call(this); + break; + case 2: + handler[i].call(this, arguments[1]); + break; + case 3: + handler[i].call(this, arguments[1], arguments[2]); + break; + default: + handler[i].apply(this, args); + } + } + return true; + } else if (!this._all && type === 'error') { + if (arguments[1] instanceof Error) { + throw arguments[1]; // Unhandled 'error' event + } else { + throw new Error("Uncaught, unspecified 'error' event."); + } + return false; + } + + return !!this._all; + }; + + EventEmitter.prototype.emitAsync = function() { + + this._events || init.call(this); + + var type = arguments[0]; + + if (type === 'newListener' && !this.newListener) { + if (!this._events.newListener) { return Promise.resolve([false]); } + } + + var promises= []; + + var al = arguments.length; + var args,l,i,j; + var handler; + + if (this._all) { + if (al > 3) { + args = new Array(al); + for (j = 1; j < al; j++) args[j] = arguments[j]; + } + for (i = 0, l = this._all.length; i < l; i++) { + this.event = type; + switch (al) { + case 1: + promises.push(this._all[i].call(this, type)); + break; + case 2: + promises.push(this._all[i].call(this, type, arguments[1])); + break; + case 3: + promises.push(this._all[i].call(this, type, arguments[1], arguments[2])); + break; + default: + promises.push(this._all[i].apply(this, args)); + } + } + } + + if (this.wildcard) { + handler = []; + var ns = typeof type === 'string' ? type.split(this.delimiter) : type.slice(); + searchListenerTree.call(this, handler, ns, this.listenerTree, 0); + } else { + handler = this._events[type]; + } + + if (typeof handler === 'function') { + this.event = type; + switch (al) { + case 1: + promises.push(handler.call(this)); + break; + case 2: + promises.push(handler.call(this, arguments[1])); + break; + case 3: + promises.push(handler.call(this, arguments[1], arguments[2])); + break; + default: + args = new Array(al - 1); + for (j = 1; j < al; j++) args[j - 1] = arguments[j]; + promises.push(handler.apply(this, args)); + } + } else if (handler && handler.length) { + if (al > 3) { + args = new Array(al - 1); + for (j = 1; j < al; j++) args[j - 1] = arguments[j]; + } + for (i = 0, l = handler.length; i < l; i++) { + this.event = type; + switch (al) { + case 1: + promises.push(handler[i].call(this)); + break; + case 2: + promises.push(handler[i].call(this, arguments[1])); + break; + case 3: + promises.push(handler[i].call(this, arguments[1], arguments[2])); + break; + default: + promises.push(handler[i].apply(this, args)); + } + } + } else if (!this._all && type === 'error') { + if (arguments[1] instanceof Error) { + return Promise.reject(arguments[1]); // Unhandled 'error' event + } else { + return Promise.reject("Uncaught, unspecified 'error' event."); + } + } + + return Promise.all(promises); + }; + + EventEmitter.prototype.on = function(type, listener) { + if (typeof type === 'function') { + this.onAny(type); + return this; + } + + if (typeof listener !== 'function') { + throw new Error('on only accepts instances of Function'); + } + this._events || init.call(this); + + // To avoid recursion in the case that type == "newListeners"! Before + // adding it to the listeners, first emit "newListeners". + this.emit('newListener', type, listener); + + if (this.wildcard) { + growListenerTree.call(this, type, listener); + return this; + } + + if (!this._events[type]) { + // Optimize the case of one listener. Don't need the extra array object. + this._events[type] = listener; + } + else { + if (typeof this._events[type] === 'function') { + // Change to array. + this._events[type] = [this._events[type]]; + } + + // If we've already got an array, just append. + this._events[type].push(listener); + + // Check for listener leak + if ( + !this._events[type].warned && + this._events.maxListeners > 0 && + this._events[type].length > this._events.maxListeners + ) { + this._events[type].warned = true; + logPossibleMemoryLeak.call(this, this._events[type].length, type); + } + } + + return this; + }; + + EventEmitter.prototype.onAny = function(fn) { + if (typeof fn !== 'function') { + throw new Error('onAny only accepts instances of Function'); + } + + if (!this._all) { + this._all = []; + } + + // Add the function to the event listener collection. + this._all.push(fn); + return this; + }; + + EventEmitter.prototype.addListener = EventEmitter.prototype.on; + + EventEmitter.prototype.off = function(type, listener) { + if (typeof listener !== 'function') { + throw new Error('removeListener only takes instances of Function'); + } + + var handlers,leafs=[]; + + if(this.wildcard) { + var ns = typeof type === 'string' ? type.split(this.delimiter) : type.slice(); + leafs = searchListenerTree.call(this, null, ns, this.listenerTree, 0); + } + else { + // does not use listeners(), so no side effect of creating _events[type] + if (!this._events[type]) return this; + handlers = this._events[type]; + leafs.push({_listeners:handlers}); + } + + for (var iLeaf=0; iLeaf 0) { + recursivelyGarbageCollect(root[key]); + } + if (Object.keys(obj).length === 0) { + delete root[key]; + } + } + } + recursivelyGarbageCollect(this.listenerTree); + + return this; + }; + + EventEmitter.prototype.offAny = function(fn) { + var i = 0, l = 0, fns; + if (fn && this._all && this._all.length > 0) { + fns = this._all; + for(i = 0, l = fns.length; i < l; i++) { + if(fn === fns[i]) { + fns.splice(i, 1); + this.emit("removeListenerAny", fn); + return this; + } + } + } else { + fns = this._all; + for(i = 0, l = fns.length; i < l; i++) + this.emit("removeListenerAny", fns[i]); + this._all = []; + } + return this; + }; + + EventEmitter.prototype.removeListener = EventEmitter.prototype.off; + + EventEmitter.prototype.removeAllListeners = function(type) { + if (arguments.length === 0) { + !this._events || init.call(this); + return this; + } + + if (this.wildcard) { + var ns = typeof type === 'string' ? type.split(this.delimiter) : type.slice(); + var leafs = searchListenerTree.call(this, null, ns, this.listenerTree, 0); + + for (var iLeaf=0; iLeaf t2.secs) { + return false; + } else if(t1.secs < t2.secs) { + return true; + } else if(t1.nsecs < t2.nsecs) { + return true; + } else { + return false; + } + }; + + // TODO: this may be more complicated than necessary, since I'm + // not sure if the callbacks can ever wind up with a scenario + // where we've been preempted by a next goal, it hasn't finished + // processing, and then we get a cancel message + cancelListener.subscribe(function(cancelMessage) { + + // cancel ALL goals if both empty + if(cancelMessage.stamp.secs === 0 && cancelMessage.stamp.secs === 0 && cancelMessage.id === '') { + that.nextGoal = null; + if(that.currentGoal) { + that.emit('cancel'); + } + } else { // treat id and stamp independently + if(that.currentGoal && cancelMessage.id === that.currentGoal.goal_id.id) { + that.emit('cancel'); + } else if(that.nextGoal && cancelMessage.id === that.nextGoal.goal_id.id) { + that.nextGoal = null; + } + + if(that.nextGoal && isEarlier(that.nextGoal.goal_id.stamp, + cancelMessage.stamp)) { + that.nextGoal = null; + } + if(that.currentGoal && isEarlier(that.currentGoal.goal_id.stamp, + cancelMessage.stamp)) { + + that.emit('cancel'); + } + } + }); + + // publish status at pseudo-fixed rate; required for clients to know they've connected + var statusInterval = setInterval( function() { + var currentTime = new Date(); + var secs = Math.floor(currentTime.getTime()/1000); + var nsecs = Math.round(1000000000*(currentTime.getTime()/1000-secs)); + that.statusMessage.header.stamp.secs = secs; + that.statusMessage.header.stamp.nsecs = nsecs; + statusPublisher.publish(that.statusMessage); + }, 500); // publish every 500ms + +} + +SimpleActionServer.prototype.__proto__ = EventEmitter2.prototype; + +/** +* Set action state to succeeded and return to client +*/ + +SimpleActionServer.prototype.setSucceeded = function(result2) { + + + var resultMessage = new Message({ + status : {goal_id : this.currentGoal.goal_id, status : 3}, + result : result2 + }); + this.resultPublisher.publish(resultMessage); + + this.statusMessage.status_list = []; + if(this.nextGoal) { + this.currentGoal = this.nextGoal; + this.nextGoal = null; + this.emit('goal', this.currentGoal.goal); + } else { + this.currentGoal = null; + } +}; + +/** +* Function to send feedback +*/ + +SimpleActionServer.prototype.sendFeedback = function(feedback2) { + + var feedbackMessage = new Message({ + status : {goal_id : this.currentGoal.goal_id, status : 1}, + feedback : feedback2 + }); + this.feedbackPublisher.publish(feedbackMessage); +}; + +/** +* Handle case where client requests preemption +*/ + +SimpleActionServer.prototype.setPreempted = function() { + + this.statusMessage.status_list = []; + var resultMessage = new Message({ + status : {goal_id : this.currentGoal.goal_id, status : 2}, + }); + this.resultPublisher.publish(resultMessage); + + if(this.nextGoal) { + this.currentGoal = this.nextGoal; + this.nextGoal = null; + this.emit('goal', this.currentGoal.goal); + } else { + this.currentGoal = null; + } +}; + +module.exports = SimpleActionServer; +},{"../core/Message":10,"../core/Topic":17,"eventemitter2":1}],9:[function(require,module,exports){ +var Ros = require('../core/Ros'); +var mixin = require('../mixin'); + +var action = module.exports = { + ActionClient: require('./ActionClient'), + ActionListener: require('./ActionListener'), + Goal: require('./Goal'), + SimpleActionServer: require('./SimpleActionServer') +}; + +mixin(Ros, ['ActionClient', 'SimpleActionServer'], action); + +},{"../core/Ros":12,"../mixin":24,"./ActionClient":5,"./ActionListener":6,"./Goal":7,"./SimpleActionServer":8}],10:[function(require,module,exports){ +/** + * @fileoverview + * @author Brandon Alexander - baalexander@gmail.com + */ + +var assign = require('object-assign'); + +/** + * Message objects are used for publishing and subscribing to and from topics. + * + * @constructor + * @param values - object matching the fields defined in the .msg definition file + */ +function Message(values) { + assign(this, values); +} + +module.exports = Message; +},{"object-assign":2}],11:[function(require,module,exports){ +/** + * @fileoverview + * @author Brandon Alexander - baalexander@gmail.com + */ + +var Service = require('./Service'); +var ServiceRequest = require('./ServiceRequest'); + +/** + * A ROS parameter. + * + * @constructor + * @param options - possible keys include: + * * ros - the ROSLIB.Ros connection handle + * * name - the param name, like max_vel_x + */ +function Param(options) { + options = options || {}; + this.ros = options.ros; + this.name = options.name; +} + +/** + * Fetches the value of the param. + * + * @param callback - function with the following params: + * * value - the value of the param from ROS. + */ +Param.prototype.get = function(callback) { + var paramClient = new Service({ + ros : this.ros, + name : '/rosapi/get_param', + serviceType : 'rosapi/GetParam' + }); + + var request = new ServiceRequest({ + name : this.name + }); + + paramClient.callService(request, function(result) { + var value = JSON.parse(result.value); + callback(value); + }); +}; + +/** + * Sets the value of the param in ROS. + * + * @param value - value to set param to. + */ +Param.prototype.set = function(value, callback) { + var paramClient = new Service({ + ros : this.ros, + name : '/rosapi/set_param', + serviceType : 'rosapi/SetParam' + }); + + var request = new ServiceRequest({ + name : this.name, + value : JSON.stringify(value) + }); + + paramClient.callService(request, callback); +}; + +/** + * Delete this parameter on the ROS server. + */ +Param.prototype.delete = function(callback) { + var paramClient = new Service({ + ros : this.ros, + name : '/rosapi/delete_param', + serviceType : 'rosapi/DeleteParam' + }); + + var request = new ServiceRequest({ + name : this.name + }); + + paramClient.callService(request, callback); +}; + +module.exports = Param; +},{"./Service":13,"./ServiceRequest":14}],12:[function(require,module,exports){ +/** + * @fileoverview + * @author Brandon Alexander - baalexander@gmail.com + */ + +var WebSocket = require('ws'); +var socketAdapter = require('./SocketAdapter.js'); + +var Service = require('./Service'); +var ServiceRequest = require('./ServiceRequest'); + +var assign = require('object-assign'); +var EventEmitter2 = require('eventemitter2').EventEmitter2; + +/** + * Manages connection to the server and all interactions with ROS. + * + * Emits the following events: + * * 'error' - there was an error with ROS + * * 'connection' - connected to the WebSocket server + * * 'close' - disconnected to the WebSocket server + * * - a message came from rosbridge with the given topic name + * * - a service response came from rosbridge with the given ID + * + * @constructor + * @param options - possible keys include:
+ * * url (optional) - (can be specified later with `connect`) the WebSocket URL for rosbridge or the node server url to connect using socket.io (if socket.io exists in the page)
+ * * groovyCompatibility - don't use interfaces that changed after the last groovy release or rosbridge_suite and related tools (defaults to true) + * * transportLibrary (optional) - one of 'websocket' (default), 'socket.io' or RTCPeerConnection instance controlling how the connection is created in `connect`. + * * transportOptions (optional) - the options to use use when creating a connection. Currently only used if `transportLibrary` is RTCPeerConnection. + */ +function Ros(options) { + options = options || {}; + this.socket = null; + this.idCounter = 0; + this.isConnected = false; + this.transportLibrary = options.transportLibrary || 'websocket'; + this.transportOptions = options.transportOptions || {}; + + if (typeof options.groovyCompatibility === 'undefined') { + this.groovyCompatibility = true; + } + else { + this.groovyCompatibility = options.groovyCompatibility; + } + + // Sets unlimited event listeners. + this.setMaxListeners(0); + + // begin by checking if a URL was given + if (options.url) { + this.connect(options.url); + } +} + +Ros.prototype.__proto__ = EventEmitter2.prototype; + +/** + * Connect to the specified WebSocket. + * + * @param url - WebSocket URL or RTCDataChannel label for Rosbridge + */ +Ros.prototype.connect = function(url) { + if (this.transportLibrary === 'socket.io') { + this.socket = assign(io(url, {'force new connection': true}), socketAdapter(this)); + this.socket.on('connect', this.socket.onopen); + this.socket.on('data', this.socket.onmessage); + this.socket.on('close', this.socket.onclose); + this.socket.on('error', this.socket.onerror); + } else if (this.transportLibrary.constructor.name === 'RTCPeerConnection') { + this.socket = assign(this.transportLibrary.createDataChannel(url, this.transportOptions), socketAdapter(this)); + }else { + this.socket = assign(new WebSocket(url), socketAdapter(this)); + } + +}; + +/** + * Disconnect from the WebSocket server. + */ +Ros.prototype.close = function() { + if (this.socket) { + this.socket.close(); + } +}; + +/** + * Sends an authorization request to the server. + * + * @param mac - MAC (hash) string given by the trusted source. + * @param client - IP of the client. + * @param dest - IP of the destination. + * @param rand - Random string given by the trusted source. + * @param t - Time of the authorization request. + * @param level - User level as a string given by the client. + * @param end - End time of the client's session. + */ +Ros.prototype.authenticate = function(mac, client, dest, rand, t, level, end) { + // create the request + var auth = { + op : 'auth', + mac : mac, + client : client, + dest : dest, + rand : rand, + t : t, + level : level, + end : end + }; + // send the request + this.callOnConnection(auth); +}; + +/** + * Sends the message over the WebSocket, but queues the message up if not yet + * connected. + */ +Ros.prototype.callOnConnection = function(message) { + var that = this; + var messageJson = JSON.stringify(message); + var emitter = null; + if (this.transportLibrary === 'socket.io') { + emitter = function(msg){that.socket.emit('operation', msg);}; + } else { + emitter = function(msg){that.socket.send(msg);}; + } + + if (!this.isConnected) { + that.once('connection', function() { + emitter(messageJson); + }); + } else { + emitter(messageJson); + } +}; + +/** + * Sends a set_level request to the server + * + * @param level - Status level (none, error, warning, info) + * @param id - Optional: Operation ID to change status level on + */ +Ros.prototype.setStatusLevel = function(level, id){ + var levelMsg = { + op: 'set_level', + level: level, + id: id + }; + + this.callOnConnection(levelMsg); +}; + +/** + * Retrieves Action Servers in ROS as an array of string + * + * * actionservers - Array of action server names + */ +Ros.prototype.getActionServers = function(callback, failedCallback) { + var getActionServers = new Service({ + ros : this, + name : '/rosapi/action_servers', + serviceType : 'rosapi/GetActionServers' + }); + + var request = new ServiceRequest({}); + if (typeof failedCallback === 'function'){ + getActionServers.callService(request, + function(result) { + callback(result.action_servers); + }, + function(message){ + failedCallback(message); + } + ); + }else{ + getActionServers.callService(request, function(result) { + callback(result.action_servers); + }); + } +}; + +/** + * Retrieves list of topics in ROS as an array. + * + * @param callback function with params: + * * topics - Array of topic names + */ +Ros.prototype.getTopics = function(callback, failedCallback) { + var topicsClient = new Service({ + ros : this, + name : '/rosapi/topics', + serviceType : 'rosapi/Topics' + }); + + var request = new ServiceRequest(); + if (typeof failedCallback === 'function'){ + topicsClient.callService(request, + function(result) { + callback(result); + }, + function(message){ + failedCallback(message); + } + ); + }else{ + topicsClient.callService(request, function(result) { + callback(result); + }); + } +}; + +/** + * Retrieves Topics in ROS as an array as specific type + * + * @param topicType topic type to find: + * @param callback function with params: + * * topics - Array of topic names + */ +Ros.prototype.getTopicsForType = function(topicType, callback, failedCallback) { + var topicsForTypeClient = new Service({ + ros : this, + name : '/rosapi/topics_for_type', + serviceType : 'rosapi/TopicsForType' + }); + + var request = new ServiceRequest({ + type: topicType + }); + if (typeof failedCallback === 'function'){ + topicsForTypeClient.callService(request, + function(result) { + callback(result.topics); + }, + function(message){ + failedCallback(message); + } + ); + }else{ + topicsForTypeClient.callService(request, function(result) { + callback(result.topics); + }); + } +}; + +/** + * Retrieves list of active service names in ROS. + * + * @param callback - function with the following params: + * * services - array of service names + */ +Ros.prototype.getServices = function(callback, failedCallback) { + var servicesClient = new Service({ + ros : this, + name : '/rosapi/services', + serviceType : 'rosapi/Services' + }); + + var request = new ServiceRequest(); + if (typeof failedCallback === 'function'){ + servicesClient.callService(request, + function(result) { + callback(result.services); + }, + function(message) { + failedCallback(message); + } + ); + }else{ + servicesClient.callService(request, function(result) { + callback(result.services); + }); + } +}; + +/** + * Retrieves list of services in ROS as an array as specific type + * + * @param serviceType service type to find: + * @param callback function with params: + * * topics - Array of service names + */ +Ros.prototype.getServicesForType = function(serviceType, callback, failedCallback) { + var servicesForTypeClient = new Service({ + ros : this, + name : '/rosapi/services_for_type', + serviceType : 'rosapi/ServicesForType' + }); + + var request = new ServiceRequest({ + type: serviceType + }); + if (typeof failedCallback === 'function'){ + servicesForTypeClient.callService(request, + function(result) { + callback(result.services); + }, + function(message) { + failedCallback(message); + } + ); + }else{ + servicesForTypeClient.callService(request, function(result) { + callback(result.services); + }); + } +}; + +/** + * Retrieves a detail of ROS service request. + * + * @param service name of service: + * @param callback - function with params: + * * type - String of the service type + */ +Ros.prototype.getServiceRequestDetails = function(type, callback, failedCallback) { + var serviceTypeClient = new Service({ + ros : this, + name : '/rosapi/service_request_details', + serviceType : 'rosapi/ServiceRequestDetails' + }); + var request = new ServiceRequest({ + type: type + }); + + if (typeof failedCallback === 'function'){ + serviceTypeClient.callService(request, + function(result) { + callback(result); + }, + function(message){ + failedCallback(message); + } + ); + }else{ + serviceTypeClient.callService(request, function(result) { + callback(result); + }); + } +}; + +/** + * Retrieves a detail of ROS service request. + * + * @param service name of service: + * @param callback - function with params: + * * type - String of the service type + */ +Ros.prototype.getServiceResponseDetails = function(type, callback, failedCallback) { + var serviceTypeClient = new Service({ + ros : this, + name : '/rosapi/service_response_details', + serviceType : 'rosapi/ServiceResponseDetails' + }); + var request = new ServiceRequest({ + type: type + }); + + if (typeof failedCallback === 'function'){ + serviceTypeClient.callService(request, + function(result) { + callback(result); + }, + function(message){ + failedCallback(message); + } + ); + }else{ + serviceTypeClient.callService(request, function(result) { + callback(result); + }); + } +}; + +/** + * Retrieves list of active node names in ROS. + * + * @param callback - function with the following params: + * * nodes - array of node names + */ +Ros.prototype.getNodes = function(callback, failedCallback) { + var nodesClient = new Service({ + ros : this, + name : '/rosapi/nodes', + serviceType : 'rosapi/Nodes' + }); + + var request = new ServiceRequest(); + if (typeof failedCallback === 'function'){ + nodesClient.callService(request, + function(result) { + callback(result.nodes); + }, + function(message) { + failedCallback(message); + } + ); + }else{ + nodesClient.callService(request, function(result) { + callback(result.nodes); + }); + } +}; + +/** + * Retrieves list subscribed topics, publishing topics and services of a specific node + * + * @param node name of the node: + * @param callback - function with params: + * * publications - array of published topic names + * * subscriptions - array of subscribed topic names + * * services - array of service names hosted + */ +Ros.prototype.getNodeDetails = function(node, callback, failedCallback) { + var nodesClient = new Service({ + ros : this, + name : '/rosapi/node_details', + serviceType : 'rosapi/NodeDetails' + }); + + var request = new ServiceRequest({ + node: node + }); + if (typeof failedCallback === 'function'){ + nodesClient.callService(request, + function(result) { + callback(result.subscribing, result.publishing, result.services); + }, + function(message) { + failedCallback(message); + } + ); + } else { + nodesClient.callService(request, function(result) { + callback(result); + }); + } +}; + +/** + * Retrieves list of param names from the ROS Parameter Server. + * + * @param callback function with params: + * * params - array of param names. + */ +Ros.prototype.getParams = function(callback, failedCallback) { + var paramsClient = new Service({ + ros : this, + name : '/rosapi/get_param_names', + serviceType : 'rosapi/GetParamNames' + }); + var request = new ServiceRequest(); + if (typeof failedCallback === 'function'){ + paramsClient.callService(request, + function(result) { + callback(result.names); + }, + function(message){ + failedCallback(message); + } + ); + }else{ + paramsClient.callService(request, function(result) { + callback(result.names); + }); + } +}; + +/** + * Retrieves a type of ROS topic. + * + * @param topic name of the topic: + * @param callback - function with params: + * * type - String of the topic type + */ +Ros.prototype.getTopicType = function(topic, callback, failedCallback) { + var topicTypeClient = new Service({ + ros : this, + name : '/rosapi/topic_type', + serviceType : 'rosapi/TopicType' + }); + var request = new ServiceRequest({ + topic: topic + }); + + if (typeof failedCallback === 'function'){ + topicTypeClient.callService(request, + function(result) { + callback(result.type); + }, + function(message){ + failedCallback(message); + } + ); + }else{ + topicTypeClient.callService(request, function(result) { + callback(result.type); + }); + } +}; + +/** + * Retrieves a type of ROS service. + * + * @param service name of service: + * @param callback - function with params: + * * type - String of the service type + */ +Ros.prototype.getServiceType = function(service, callback, failedCallback) { + var serviceTypeClient = new Service({ + ros : this, + name : '/rosapi/service_type', + serviceType : 'rosapi/ServiceType' + }); + var request = new ServiceRequest({ + service: service + }); + + if (typeof failedCallback === 'function'){ + serviceTypeClient.callService(request, + function(result) { + callback(result.type); + }, + function(message){ + failedCallback(message); + } + ); + }else{ + serviceTypeClient.callService(request, function(result) { + callback(result.type); + }); + } +}; + +/** + * Retrieves a detail of ROS message. + * + * @param callback - function with params: + * * details - Array of the message detail + * @param message - String of a topic type + */ +Ros.prototype.getMessageDetails = function(message, callback, failedCallback) { + var messageDetailClient = new Service({ + ros : this, + name : '/rosapi/message_details', + serviceType : 'rosapi/MessageDetails' + }); + var request = new ServiceRequest({ + type: message + }); + + if (typeof failedCallback === 'function'){ + messageDetailClient.callService(request, + function(result) { + callback(result.typedefs); + }, + function(message){ + failedCallback(message); + } + ); + }else{ + messageDetailClient.callService(request, function(result) { + callback(result.typedefs); + }); + } +}; + +/** + * Decode a typedefs into a dictionary like `rosmsg show foo/bar` + * + * @param defs - array of type_def dictionary + */ +Ros.prototype.decodeTypeDefs = function(defs) { + var that = this; + + // calls itself recursively to resolve type definition using hints. + var decodeTypeDefsRec = function(theType, hints) { + var typeDefDict = {}; + for (var i = 0; i < theType.fieldnames.length; i++) { + var arrayLen = theType.fieldarraylen[i]; + var fieldName = theType.fieldnames[i]; + var fieldType = theType.fieldtypes[i]; + if (fieldType.indexOf('/') === -1) { // check the fieldType includes '/' or not + if (arrayLen === -1) { + typeDefDict[fieldName] = fieldType; + } + else { + typeDefDict[fieldName] = [fieldType]; + } + } + else { + // lookup the name + var sub = false; + for (var j = 0; j < hints.length; j++) { + if (hints[j].type.toString() === fieldType.toString()) { + sub = hints[j]; + break; + } + } + if (sub) { + var subResult = decodeTypeDefsRec(sub, hints); + if (arrayLen === -1) { + } + else { + typeDefDict[fieldName] = [subResult]; + } + } + else { + that.emit('error', 'Cannot find ' + fieldType + ' in decodeTypeDefs'); + } + } + } + return typeDefDict; + }; + + return decodeTypeDefsRec(defs[0], defs); +}; + + +module.exports = Ros; + +},{"./Service":13,"./ServiceRequest":14,"./SocketAdapter.js":16,"eventemitter2":1,"object-assign":2,"ws":39}],13:[function(require,module,exports){ +/** + * @fileoverview + * @author Brandon Alexander - baalexander@gmail.com + */ + +var ServiceResponse = require('./ServiceResponse'); +var ServiceRequest = require('./ServiceRequest'); +var EventEmitter2 = require('eventemitter2').EventEmitter2; + +/** + * A ROS service client. + * + * @constructor + * @params options - possible keys include: + * * ros - the ROSLIB.Ros connection handle + * * name - the service name, like /add_two_ints + * * serviceType - the service type, like 'rospy_tutorials/AddTwoInts' + */ +function Service(options) { + options = options || {}; + this.ros = options.ros; + this.name = options.name; + this.serviceType = options.serviceType; + this.isAdvertised = false; + + this._serviceCallback = null; +} +Service.prototype.__proto__ = EventEmitter2.prototype; +/** + * Calls the service. Returns the service response in the callback. + * + * @param request - the ROSLIB.ServiceRequest to send + * @param callback - function with params: + * * response - the response from the service request + * @param failedCallback - the callback function when the service call failed (optional). Params: + * * error - the error message reported by ROS + */ +Service.prototype.callService = function(request, callback, failedCallback) { + if (this.isAdvertised) { + return; + } + + var serviceCallId = 'call_service:' + this.name + ':' + (++this.ros.idCounter); + + if (callback || failedCallback) { + this.ros.once(serviceCallId, function(message) { + if (message.result !== undefined && message.result === false) { + if (typeof failedCallback === 'function') { + failedCallback(message.values); + } + } else if (typeof callback === 'function') { + callback(new ServiceResponse(message.values)); + } + }); + } + + var call = { + op : 'call_service', + id : serviceCallId, + service : this.name, + args : request + }; + this.ros.callOnConnection(call); +}; + +/** + * Every time a message is published for the given topic, the callback + * will be called with the message object. + * + * @param callback - function with the following params: + * * message - the published message + */ +Service.prototype.advertise = function(callback) { + if (this.isAdvertised || typeof callback !== 'function') { + return; + } + + this._serviceCallback = callback; + this.ros.on(this.name, this._serviceResponse.bind(this)); + this.ros.callOnConnection({ + op: 'advertise_service', + type: this.serviceType, + service: this.name + }); + this.isAdvertised = true; +}; + +Service.prototype.unadvertise = function() { + if (!this.isAdvertised) { + return; + } + this.ros.callOnConnection({ + op: 'unadvertise_service', + service: this.name + }); + this.isAdvertised = false; +}; + +Service.prototype._serviceResponse = function(rosbridgeRequest) { + var response = {}; + var success = this._serviceCallback(rosbridgeRequest.args, response); + + var call = { + op: 'service_response', + service: this.name, + values: new ServiceResponse(response), + result: success + }; + + if (rosbridgeRequest.id) { + call.id = rosbridgeRequest.id; + } + + this.ros.callOnConnection(call); +}; + +module.exports = Service; +},{"./ServiceRequest":14,"./ServiceResponse":15,"eventemitter2":1}],14:[function(require,module,exports){ +/** + * @fileoverview + * @author Brandon Alexander - balexander@willowgarage.com + */ + +var assign = require('object-assign'); + +/** + * A ServiceRequest is passed into the service call. + * + * @constructor + * @param values - object matching the fields defined in the .srv definition file + */ +function ServiceRequest(values) { + assign(this, values); +} + +module.exports = ServiceRequest; +},{"object-assign":2}],15:[function(require,module,exports){ +/** + * @fileoverview + * @author Brandon Alexander - balexander@willowgarage.com + */ + +var assign = require('object-assign'); + +/** + * A ServiceResponse is returned from the service call. + * + * @constructor + * @param values - object matching the fields defined in the .srv definition file + */ +function ServiceResponse(values) { + assign(this, values); +} + +module.exports = ServiceResponse; +},{"object-assign":2}],16:[function(require,module,exports){ +/** + * Socket event handling utilities for handling events on either + * WebSocket and TCP sockets + * + * Note to anyone reviewing this code: these functions are called + * in the context of their parent object, unless bound + * @fileOverview + */ +'use strict'; + +var decompressPng = require('../util/decompressPng'); +var WebSocket = require('ws'); +var BSON = null; +if(typeof bson !== 'undefined'){ + BSON = bson().BSON; +} + +/** + * Events listeners for a WebSocket or TCP socket to a JavaScript + * ROS Client. Sets up Messages for a given topic to trigger an + * event on the ROS client. + * + * @namespace SocketAdapter + * @private + */ +function SocketAdapter(client) { + function handleMessage(message) { + if (message.op === 'publish') { + client.emit(message.topic, message.msg); + } else if (message.op === 'service_response') { + client.emit(message.id, message); + } else if (message.op === 'call_service') { + client.emit(message.service, message); + } else if(message.op === 'status'){ + if(message.id){ + client.emit('status:'+message.id, message); + } else { + client.emit('status', message); + } + } + } + + function handlePng(message, callback) { + if (message.op === 'png') { + decompressPng(message.data, callback); + } else { + callback(message); + } + } + + function decodeBSON(data, callback) { + if (!BSON) { + throw 'Cannot process BSON encoded message without BSON header.'; + } + var reader = new FileReader(); + reader.onload = function() { + var uint8Array = new Uint8Array(this.result); + var msg = BSON.deserialize(uint8Array); + callback(msg); + }; + reader.readAsArrayBuffer(data); + } + + return { + /** + * Emits a 'connection' event on WebSocket connection. + * + * @param event - the argument to emit with the event. + * @memberof SocketAdapter + */ + onopen: function onOpen(event) { + client.isConnected = true; + client.emit('connection', event); + }, + + /** + * Emits a 'close' event on WebSocket disconnection. + * + * @param event - the argument to emit with the event. + * @memberof SocketAdapter + */ + onclose: function onClose(event) { + client.isConnected = false; + client.emit('close', event); + }, + + /** + * Emits an 'error' event whenever there was an error. + * + * @param event - the argument to emit with the event. + * @memberof SocketAdapter + */ + onerror: function onError(event) { + client.emit('error', event); + }, + + /** + * Parses message responses from rosbridge and sends to the appropriate + * topic, service, or param. + * + * @param message - the raw JSON message from rosbridge. + * @memberof SocketAdapter + */ + onmessage: function onMessage(data) { + if (typeof Blob !== 'undefined' && data.data instanceof Blob) { + decodeBSON(data.data, function (message) { + handlePng(message, handleMessage); + }); + } else { + var message = JSON.parse(typeof data === 'string' ? data : data.data); + handlePng(message, handleMessage); + } + } + }; +} + +module.exports = SocketAdapter; + +},{"../util/decompressPng":41,"ws":39}],17:[function(require,module,exports){ +/** + * @fileoverview + * @author Brandon Alexander - baalexander@gmail.com + */ + +var EventEmitter2 = require('eventemitter2').EventEmitter2; +var Message = require('./Message'); + +/** + * Publish and/or subscribe to a topic in ROS. + * + * Emits the following events: + * * 'warning' - if there are any warning during the Topic creation + * * 'message' - the message data from rosbridge + * + * @constructor + * @param options - object with following keys: + * * ros - the ROSLIB.Ros connection handle + * * name - the topic name, like /cmd_vel + * * messageType - the message type, like 'std_msgs/String' + * * compression - the type of compression to use, like 'png' + * * throttle_rate - the rate (in ms in between messages) at which to throttle the topics + * * queue_size - the queue created at bridge side for re-publishing webtopics (defaults to 100) + * * latch - latch the topic when publishing + * * queue_length - the queue length at bridge side used when subscribing (defaults to 0, no queueing). + * * reconnect_on_close - the flag to enable resubscription and readvertisement on close event(defaults to true). + */ +function Topic(options) { + options = options || {}; + this.ros = options.ros; + this.name = options.name; + this.messageType = options.messageType; + this.isAdvertised = false; + this.compression = options.compression || 'none'; + this.throttle_rate = options.throttle_rate || 0; + this.latch = options.latch || false; + this.queue_size = options.queue_size || 100; + this.queue_length = options.queue_length || 0; + this.reconnect_on_close = options.reconnect_on_close || true; + + // Check for valid compression types + if (this.compression && this.compression !== 'png' && + this.compression !== 'none') { + this.emit('warning', this.compression + + ' compression is not supported. No compression will be used.'); + } + + // Check if throttle rate is negative + if (this.throttle_rate < 0) { + this.emit('warning', this.throttle_rate + ' is not allowed. Set to 0'); + this.throttle_rate = 0; + } + + var that = this; + if (this.reconnect_on_close) { + this.callForSubscribeAndAdvertise = function(message) { + that.ros.callOnConnection(message); + + that.waitForReconnect = false; + that.reconnectFunc = function() { + if(!that.waitForReconnect) { + that.waitForReconnect = true; + that.ros.callOnConnection(message); + that.ros.once('connection', function() { + that.waitForReconnect = false; + }); + } + }; + that.ros.on('close', that.reconnectFunc); + }; + } + else { + this.callForSubscribeAndAdvertise = this.ros.callOnConnection; + } + + this._messageCallback = function(data) { + that.emit('message', new Message(data)); + }; +} +Topic.prototype.__proto__ = EventEmitter2.prototype; + +/** + * Every time a message is published for the given topic, the callback + * will be called with the message object. + * + * @param callback - function with the following params: + * * message - the published message + */ +Topic.prototype.subscribe = function(callback) { + if (typeof callback === 'function') { + this.on('message', callback); + } + + if (this.subscribeId) { return; } + this.ros.on(this.name, this._messageCallback); + this.subscribeId = 'subscribe:' + this.name + ':' + (++this.ros.idCounter); + + this.callForSubscribeAndAdvertise({ + op: 'subscribe', + id: this.subscribeId, + type: this.messageType, + topic: this.name, + compression: this.compression, + throttle_rate: this.throttle_rate, + queue_length: this.queue_length + }); +}; + +/** + * Unregisters as a subscriber for the topic. Unsubscribing stop remove + * all subscribe callbacks. To remove a call back, you must explicitly + * pass the callback function in. + * + * @param callback - the optional callback to unregister, if + * * provided and other listeners are registered the topic won't + * * unsubscribe, just stop emitting to the passed listener + */ +Topic.prototype.unsubscribe = function(callback) { + if (callback) { + this.off('message', callback); + // If there is any other callbacks still subscribed don't unsubscribe + if (this.listeners('message').length) { return; } + } + if (!this.subscribeId) { return; } + // Note: Don't call this.removeAllListeners, allow client to handle that themselves + this.ros.off(this.name, this._messageCallback); + if(this.reconnect_on_close) { + this.ros.off('close', this.reconnectFunc); + } + this.emit('unsubscribe'); + this.ros.callOnConnection({ + op: 'unsubscribe', + id: this.subscribeId, + topic: this.name + }); + this.subscribeId = null; +}; + + +/** + * Registers as a publisher for the topic. + */ +Topic.prototype.advertise = function() { + if (this.isAdvertised) { + return; + } + this.advertiseId = 'advertise:' + this.name + ':' + (++this.ros.idCounter); + this.callForSubscribeAndAdvertise({ + op: 'advertise', + id: this.advertiseId, + type: this.messageType, + topic: this.name, + latch: this.latch, + queue_size: this.queue_size + }); + this.isAdvertised = true; + + if(!this.reconnect_on_close) { + var that = this; + this.ros.on('close', function() { + that.isAdvertised = false; + }); + } +}; + +/** + * Unregisters as a publisher for the topic. + */ +Topic.prototype.unadvertise = function() { + if (!this.isAdvertised) { + return; + } + if(this.reconnect_on_close) { + this.ros.off('close', this.reconnectFunc); + } + this.emit('unadvertise'); + this.ros.callOnConnection({ + op: 'unadvertise', + id: this.advertiseId, + topic: this.name + }); + this.isAdvertised = false; +}; + +/** + * Publish the message. + * + * @param message - A ROSLIB.Message object. + */ +Topic.prototype.publish = function(message) { + if (!this.isAdvertised) { + this.advertise(); + } + + this.ros.idCounter++; + var call = { + op: 'publish', + id: 'publish:' + this.name + ':' + this.ros.idCounter, + topic: this.name, + msg: message, + latch: this.latch + }; + this.ros.callOnConnection(call); +}; + +module.exports = Topic; + +},{"./Message":10,"eventemitter2":1}],18:[function(require,module,exports){ +var mixin = require('../mixin'); + +var core = module.exports = { + Ros: require('./Ros'), + Topic: require('./Topic'), + Message: require('./Message'), + Param: require('./Param'), + Service: require('./Service'), + ServiceRequest: require('./ServiceRequest'), + ServiceResponse: require('./ServiceResponse') +}; + +mixin(core.Ros, ['Param', 'Service', 'Topic'], core); + +},{"../mixin":24,"./Message":10,"./Param":11,"./Ros":12,"./Service":13,"./ServiceRequest":14,"./ServiceResponse":15,"./Topic":17}],19:[function(require,module,exports){ +/** + * @fileoverview + * @author David Gossow - dgossow@willowgarage.com + */ + +var Vector3 = require('./Vector3'); +var Quaternion = require('./Quaternion'); + +/** + * A Pose in 3D space. Values are copied into this object. + * + * @constructor + * @param options - object with following keys: + * * position - the Vector3 describing the position + * * orientation - the ROSLIB.Quaternion describing the orientation + */ +function Pose(options) { + options = options || {}; + // copy the values into this object if they exist + this.position = new Vector3(options.position); + this.orientation = new Quaternion(options.orientation); +} + +/** + * Apply a transform against this pose. + * + * @param tf the transform + */ +Pose.prototype.applyTransform = function(tf) { + this.position.multiplyQuaternion(tf.rotation); + this.position.add(tf.translation); + var tmp = tf.rotation.clone(); + tmp.multiply(this.orientation); + this.orientation = tmp; +}; + +/** + * Clone a copy of this pose. + * + * @returns the cloned pose + */ +Pose.prototype.clone = function() { + return new Pose(this); +}; + +module.exports = Pose; +},{"./Quaternion":20,"./Vector3":22}],20:[function(require,module,exports){ +/** + * @fileoverview + * @author David Gossow - dgossow@willowgarage.com + */ + +/** + * A Quaternion. + * + * @constructor + * @param options - object with following keys: + * * x - the x value + * * y - the y value + * * z - the z value + * * w - the w value + */ +function Quaternion(options) { + options = options || {}; + this.x = options.x || 0; + this.y = options.y || 0; + this.z = options.z || 0; + this.w = (typeof options.w === 'number') ? options.w : 1; +} + +/** + * Perform a conjugation on this quaternion. + */ +Quaternion.prototype.conjugate = function() { + this.x *= -1; + this.y *= -1; + this.z *= -1; +}; + +/** + * Return the norm of this quaternion. + */ +Quaternion.prototype.norm = function() { + return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w); +}; + +/** + * Perform a normalization on this quaternion. + */ +Quaternion.prototype.normalize = function() { + var l = Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w); + if (l === 0) { + this.x = 0; + this.y = 0; + this.z = 0; + this.w = 1; + } else { + l = 1 / l; + this.x = this.x * l; + this.y = this.y * l; + this.z = this.z * l; + this.w = this.w * l; + } +}; + +/** + * Convert this quaternion into its inverse. + */ +Quaternion.prototype.invert = function() { + this.conjugate(); + this.normalize(); +}; + +/** + * Set the values of this quaternion to the product of itself and the given quaternion. + * + * @param q the quaternion to multiply with + */ +Quaternion.prototype.multiply = function(q) { + var newX = this.x * q.w + this.y * q.z - this.z * q.y + this.w * q.x; + var newY = -this.x * q.z + this.y * q.w + this.z * q.x + this.w * q.y; + var newZ = this.x * q.y - this.y * q.x + this.z * q.w + this.w * q.z; + var newW = -this.x * q.x - this.y * q.y - this.z * q.z + this.w * q.w; + this.x = newX; + this.y = newY; + this.z = newZ; + this.w = newW; +}; + +/** + * Clone a copy of this quaternion. + * + * @returns the cloned quaternion + */ +Quaternion.prototype.clone = function() { + return new Quaternion(this); +}; + +module.exports = Quaternion; + +},{}],21:[function(require,module,exports){ +/** + * @fileoverview + * @author David Gossow - dgossow@willowgarage.com + */ + +var Vector3 = require('./Vector3'); +var Quaternion = require('./Quaternion'); + +/** + * A Transform in 3-space. Values are copied into this object. + * + * @constructor + * @param options - object with following keys: + * * translation - the Vector3 describing the translation + * * rotation - the ROSLIB.Quaternion describing the rotation + */ +function Transform(options) { + options = options || {}; + // Copy the values into this object if they exist + this.translation = new Vector3(options.translation); + this.rotation = new Quaternion(options.rotation); +} + +/** + * Clone a copy of this transform. + * + * @returns the cloned transform + */ +Transform.prototype.clone = function() { + return new Transform(this); +}; + +module.exports = Transform; +},{"./Quaternion":20,"./Vector3":22}],22:[function(require,module,exports){ +/** + * @fileoverview + * @author David Gossow - dgossow@willowgarage.com + */ + +/** + * A 3D vector. + * + * @constructor + * @param options - object with following keys: + * * x - the x value + * * y - the y value + * * z - the z value + */ +function Vector3(options) { + options = options || {}; + this.x = options.x || 0; + this.y = options.y || 0; + this.z = options.z || 0; +} + +/** + * Set the values of this vector to the sum of itself and the given vector. + * + * @param v the vector to add with + */ +Vector3.prototype.add = function(v) { + this.x += v.x; + this.y += v.y; + this.z += v.z; +}; + +/** + * Set the values of this vector to the difference of itself and the given vector. + * + * @param v the vector to subtract with + */ +Vector3.prototype.subtract = function(v) { + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; +}; + +/** + * Multiply the given Quaternion with this vector. + * + * @param q - the quaternion to multiply with + */ +Vector3.prototype.multiplyQuaternion = function(q) { + var ix = q.w * this.x + q.y * this.z - q.z * this.y; + var iy = q.w * this.y + q.z * this.x - q.x * this.z; + var iz = q.w * this.z + q.x * this.y - q.y * this.x; + var iw = -q.x * this.x - q.y * this.y - q.z * this.z; + this.x = ix * q.w + iw * -q.x + iy * -q.z - iz * -q.y; + this.y = iy * q.w + iw * -q.y + iz * -q.x - ix * -q.z; + this.z = iz * q.w + iw * -q.z + ix * -q.y - iy * -q.x; +}; + +/** + * Clone a copy of this vector. + * + * @returns the cloned vector + */ +Vector3.prototype.clone = function() { + return new Vector3(this); +}; + +module.exports = Vector3; +},{}],23:[function(require,module,exports){ +module.exports = { + Pose: require('./Pose'), + Quaternion: require('./Quaternion'), + Transform: require('./Transform'), + Vector3: require('./Vector3') +}; + +},{"./Pose":19,"./Quaternion":20,"./Transform":21,"./Vector3":22}],24:[function(require,module,exports){ +/** + * Mixin a feature to the core/Ros prototype. + * For example, mixin(Ros, ['Topic'], {Topic: }) + * will add a topic bound to any Ros instances so a user + * can call `var topic = ros.Topic({name: '/foo'});` + * + * @author Graeme Yeates - github.com/megawac + */ +module.exports = function(Ros, classes, features) { + classes.forEach(function(className) { + var Class = features[className]; + Ros.prototype[className] = function(options) { + options.ros = this; + return new Class(options); + }; + }); +}; + +},{}],25:[function(require,module,exports){ +/** + * @fileoverview + * @author David Gossow - dgossow@willowgarage.com + */ + +var ActionClient = require('../actionlib/ActionClient'); +var Goal = require('../actionlib/Goal'); + +var Service = require('../core/Service.js'); +var ServiceRequest = require('../core/ServiceRequest.js'); + +var Transform = require('../math/Transform'); + +/** + * A TF Client that listens to TFs from tf2_web_republisher. + * + * @constructor + * @param options - object with following keys: + * * ros - the ROSLIB.Ros connection handle + * * fixedFrame - the fixed frame, like /base_link + * * angularThres - the angular threshold for the TF republisher + * * transThres - the translation threshold for the TF republisher + * * rate - the rate for the TF republisher + * * updateDelay - the time (in ms) to wait after a new subscription + * to update the TF republisher's list of TFs + * * topicTimeout - the timeout parameter for the TF republisher + * * serverName (optional) - the name of the tf2_web_republisher server + * * repubServiceName (optional) - the name of the republish_tfs service (non groovy compatibility mode only) + * default: '/republish_tfs' + */ +function TFClient(options) { + options = options || {}; + this.ros = options.ros; + this.fixedFrame = options.fixedFrame || '/base_link'; + this.angularThres = options.angularThres || 2.0; + this.transThres = options.transThres || 0.01; + this.rate = options.rate || 10.0; + this.updateDelay = options.updateDelay || 50; + var seconds = options.topicTimeout || 2.0; + var secs = Math.floor(seconds); + var nsecs = Math.floor((seconds - secs) * 1000000000); + this.topicTimeout = { + secs: secs, + nsecs: nsecs + }; + this.serverName = options.serverName || '/tf2_web_republisher'; + this.repubServiceName = options.repubServiceName || '/republish_tfs'; + + this.currentGoal = false; + this.currentTopic = false; + this.frameInfos = {}; + this.republisherUpdateRequested = false; + + // Create an Action client + this.actionClient = this.ros.ActionClient({ + serverName : this.serverName, + actionName : 'tf2_web_republisher/TFSubscriptionAction', + omitStatus : true, + omitResult : true + }); + + // Create a Service client + this.serviceClient = this.ros.Service({ + name: this.repubServiceName, + serviceType: 'tf2_web_republisher/RepublishTFs' + }); +} + +/** + * Process the incoming TF message and send them out using the callback + * functions. + * + * @param tf - the TF message from the server + */ +TFClient.prototype.processTFArray = function(tf) { + var that = this; + tf.transforms.forEach(function(transform) { + var frameID = transform.child_frame_id; + if (frameID[0] === '/') + { + frameID = frameID.substring(1); + } + var info = this.frameInfos[frameID]; + if (info) { + info.transform = new Transform({ + translation : transform.transform.translation, + rotation : transform.transform.rotation + }); + info.cbs.forEach(function(cb) { + cb(info.transform); + }); + } + }, this); +}; + +/** + * Create and send a new goal (or service request) to the tf2_web_republisher + * based on the current list of TFs. + */ +TFClient.prototype.updateGoal = function() { + var goalMessage = { + source_frames : Object.keys(this.frameInfos), + target_frame : this.fixedFrame, + angular_thres : this.angularThres, + trans_thres : this.transThres, + rate : this.rate + }; + + // if we're running in groovy compatibility mode (the default) + // then use the action interface to tf2_web_republisher + if(this.ros.groovyCompatibility) { + if (this.currentGoal) { + this.currentGoal.cancel(); + } + this.currentGoal = new Goal({ + actionClient : this.actionClient, + goalMessage : goalMessage + }); + + this.currentGoal.on('feedback', this.processTFArray.bind(this)); + this.currentGoal.send(); + } + else { + // otherwise, use the service interface + // The service interface has the same parameters as the action, + // plus the timeout + goalMessage.timeout = this.topicTimeout; + var request = new ServiceRequest(goalMessage); + + this.serviceClient.callService(request, this.processResponse.bind(this)); + } + + this.republisherUpdateRequested = false; +}; + +/** + * Process the service response and subscribe to the tf republisher + * topic + * + * @param response the service response containing the topic name + */ +TFClient.prototype.processResponse = function(response) { + // if we subscribed to a topic before, unsubscribe so + // the republisher stops publishing it + if (this.currentTopic) { + this.currentTopic.unsubscribe(); + } + + this.currentTopic = this.ros.Topic({ + name: response.topic_name, + messageType: 'tf2_web_republisher/TFArray' + }); + this.currentTopic.subscribe(this.processTFArray.bind(this)); +}; + +/** + * Subscribe to the given TF frame. + * + * @param frameID - the TF frame to subscribe to + * @param callback - function with params: + * * transform - the transform data + */ +TFClient.prototype.subscribe = function(frameID, callback) { + // remove leading slash, if it's there + if (frameID[0] === '/') + { + frameID = frameID.substring(1); + } + // if there is no callback registered for the given frame, create emtpy callback list + if (!this.frameInfos[frameID]) { + this.frameInfos[frameID] = { + cbs: [] + }; + if (!this.republisherUpdateRequested) { + setTimeout(this.updateGoal.bind(this), this.updateDelay); + this.republisherUpdateRequested = true; + } + } + // if we already have a transform, call back immediately + else if (this.frameInfos[frameID].transform) { + callback(this.frameInfos[frameID].transform); + } + this.frameInfos[frameID].cbs.push(callback); +}; + +/** + * Unsubscribe from the given TF frame. + * + * @param frameID - the TF frame to unsubscribe from + * @param callback - the callback function to remove + */ +TFClient.prototype.unsubscribe = function(frameID, callback) { + // remove leading slash, if it's there + if (frameID[0] === '/') + { + frameID = frameID.substring(1); + } + var info = this.frameInfos[frameID]; + for (var cbs = info && info.cbs || [], idx = cbs.length; idx--;) { + if (cbs[idx] === callback) { + cbs.splice(idx, 1); + } + } + if (!callback || cbs.length === 0) { + delete this.frameInfos[frameID]; + } +}; + +/** + * Unsubscribe and unadvertise all topics associated with this TFClient. + */ +TFClient.prototype.dispose = function() { + this.actionClient.dispose(); + if (this.currentTopic) { + this.currentTopic.unsubscribe(); + } +}; + +module.exports = TFClient; + +},{"../actionlib/ActionClient":5,"../actionlib/Goal":7,"../core/Service.js":13,"../core/ServiceRequest.js":14,"../math/Transform":21}],26:[function(require,module,exports){ +var Ros = require('../core/Ros'); +var mixin = require('../mixin'); + +var tf = module.exports = { + TFClient: require('./TFClient') +}; + +mixin(Ros, ['TFClient'], tf); +},{"../core/Ros":12,"../mixin":24,"./TFClient":25}],27:[function(require,module,exports){ +/** + * @fileOverview + * @author Benjamin Pitzer - ben.pitzer@gmail.com + * @author Russell Toris - rctoris@wpi.edu + */ + +var Vector3 = require('../math/Vector3'); +var UrdfTypes = require('./UrdfTypes'); + +/** + * A Box element in a URDF. + * + * @constructor + * @param options - object with following keys: + * * xml - the XML element to parse + */ +function UrdfBox(options) { + this.dimension = null; + this.type = UrdfTypes.URDF_BOX; + + // Parse the xml string + var xyz = options.xml.getAttribute('size').split(' '); + this.dimension = new Vector3({ + x : parseFloat(xyz[0]), + y : parseFloat(xyz[1]), + z : parseFloat(xyz[2]) + }); +} + +module.exports = UrdfBox; +},{"../math/Vector3":22,"./UrdfTypes":36}],28:[function(require,module,exports){ +/** + * @fileOverview + * @author Benjamin Pitzer - ben.pitzer@gmail.com + * @author Russell Toris - rctoris@wpi.edu + */ + +/** + * A Color element in a URDF. + * + * @constructor + * @param options - object with following keys: + * * xml - the XML element to parse + */ +function UrdfColor(options) { + // Parse the xml string + var rgba = options.xml.getAttribute('rgba').split(' '); + this.r = parseFloat(rgba[0]); + this.g = parseFloat(rgba[1]); + this.b = parseFloat(rgba[2]); + this.a = parseFloat(rgba[3]); +} + +module.exports = UrdfColor; +},{}],29:[function(require,module,exports){ +/** + * @fileOverview + * @author Benjamin Pitzer - ben.pitzer@gmail.com + * @author Russell Toris - rctoris@wpi.edu + */ + +var UrdfTypes = require('./UrdfTypes'); + +/** + * A Cylinder element in a URDF. + * + * @constructor + * @param options - object with following keys: + * * xml - the XML element to parse + */ +function UrdfCylinder(options) { + this.type = UrdfTypes.URDF_CYLINDER; + this.length = parseFloat(options.xml.getAttribute('length')); + this.radius = parseFloat(options.xml.getAttribute('radius')); +} + +module.exports = UrdfCylinder; +},{"./UrdfTypes":36}],30:[function(require,module,exports){ +/** + * @fileOverview + * @author David V. Lu!! davidvlu@gmail.com + */ + +/** + * A Joint element in a URDF. + * + * @constructor + * @param options - object with following keys: + * * xml - the XML element to parse + */ +function UrdfJoint(options) { + this.name = options.xml.getAttribute('name'); + this.type = options.xml.getAttribute('type'); + + var parents = options.xml.getElementsByTagName('parent'); + if(parents.length > 0) { + this.parent = parents[0].getAttribute('link'); + } + + var children = options.xml.getElementsByTagName('child'); + if(children.length > 0) { + this.child = children[0].getAttribute('link'); + } + + var limits = options.xml.getElementsByTagName('limit'); + if (limits.length > 0) { + this.minval = parseFloat( limits[0].getAttribute('lower') ); + this.maxval = parseFloat( limits[0].getAttribute('upper') ); + } +} + +module.exports = UrdfJoint; + +},{}],31:[function(require,module,exports){ +/** + * @fileOverview + * @author Benjamin Pitzer - ben.pitzer@gmail.com + * @author Russell Toris - rctoris@wpi.edu + */ + +var UrdfVisual = require('./UrdfVisual'); + +/** + * A Link element in a URDF. + * + * @constructor + * @param options - object with following keys: + * * xml - the XML element to parse + */ +function UrdfLink(options) { + this.name = options.xml.getAttribute('name'); + this.visuals = []; + var visuals = options.xml.getElementsByTagName('visual'); + + for( var i=0; i 0) { + this.textureFilename = textures[0].getAttribute('filename'); + } + + // Color + var colors = options.xml.getElementsByTagName('color'); + if (colors.length > 0) { + // Parse the RBGA string + this.color = new UrdfColor({ + xml : colors[0] + }); + } +} + +UrdfMaterial.prototype.isLink = function() { + return this.color === null && this.textureFilename === null; +}; + +var assign = require('object-assign'); + +UrdfMaterial.prototype.assign = function(obj) { + return assign(this, obj); +}; + +module.exports = UrdfMaterial; + +},{"./UrdfColor":28,"object-assign":2}],33:[function(require,module,exports){ +/** + * @fileOverview + * @author Benjamin Pitzer - ben.pitzer@gmail.com + * @author Russell Toris - rctoris@wpi.edu + */ + +var Vector3 = require('../math/Vector3'); +var UrdfTypes = require('./UrdfTypes'); + +/** + * A Mesh element in a URDF. + * + * @constructor + * @param options - object with following keys: + * * xml - the XML element to parse + */ +function UrdfMesh(options) { + this.scale = null; + + this.type = UrdfTypes.URDF_MESH; + this.filename = options.xml.getAttribute('filename'); + + // Check for a scale + var scale = options.xml.getAttribute('scale'); + if (scale) { + // Get the XYZ + var xyz = scale.split(' '); + this.scale = new Vector3({ + x : parseFloat(xyz[0]), + y : parseFloat(xyz[1]), + z : parseFloat(xyz[2]) + }); + } +} + +module.exports = UrdfMesh; +},{"../math/Vector3":22,"./UrdfTypes":36}],34:[function(require,module,exports){ +/** + * @fileOverview + * @author Benjamin Pitzer - ben.pitzer@gmail.com + * @author Russell Toris - rctoris@wpi.edu + */ + +var UrdfMaterial = require('./UrdfMaterial'); +var UrdfLink = require('./UrdfLink'); +var UrdfJoint = require('./UrdfJoint'); +var DOMParser = require('xmldom').DOMParser; + +// See https://developer.mozilla.org/docs/XPathResult#Constants +var XPATH_FIRST_ORDERED_NODE_TYPE = 9; + +/** + * A URDF Model can be used to parse a given URDF into the appropriate elements. + * + * @constructor + * @param options - object with following keys: + * * xml - the XML element to parse + * * string - the XML element to parse as a string + */ +function UrdfModel(options) { + options = options || {}; + var xmlDoc = options.xml; + var string = options.string; + this.materials = {}; + this.links = {}; + this.joints = {}; + + // Check if we are using a string or an XML element + if (string) { + // Parse the string + var parser = new DOMParser(); + xmlDoc = parser.parseFromString(string, 'text/xml'); + } + + // Initialize the model with the given XML node. + // Get the robot tag + var robotXml = xmlDoc.documentElement; + + // Get the robot name + this.name = robotXml.getAttribute('name'); + + // Parse all the visual elements we need + for (var nodes = robotXml.childNodes, i = 0; i < nodes.length; i++) { + var node = nodes[i]; + if (node.tagName === 'material') { + var material = new UrdfMaterial({ + xml : node + }); + // Make sure this is unique + if (this.materials[material.name] !== void 0) { + if( this.materials[material.name].isLink() ) { + this.materials[material.name].assign( material ); + } else { + console.warn('Material ' + material.name + 'is not unique.'); + } + } else { + this.materials[material.name] = material; + } + } else if (node.tagName === 'link') { + var link = new UrdfLink({ + xml : node + }); + // Make sure this is unique + if (this.links[link.name] !== void 0) { + console.warn('Link ' + link.name + ' is not unique.'); + } else { + // Check for a material + for( var j=0; j 0) { + var geom = geoms[0]; + var shape = null; + // Check for the shape + for (var i = 0; i < geom.childNodes.length; i++) { + var node = geom.childNodes[i]; + if (node.nodeType === 1) { + shape = node; + break; + } + } + // Check the type + var type = shape.nodeName; + if (type === 'sphere') { + this.geometry = new UrdfSphere({ + xml : shape + }); + } else if (type === 'box') { + this.geometry = new UrdfBox({ + xml : shape + }); + } else if (type === 'cylinder') { + this.geometry = new UrdfCylinder({ + xml : shape + }); + } else if (type === 'mesh') { + this.geometry = new UrdfMesh({ + xml : shape + }); + } else { + console.warn('Unknown geometry type ' + type); + } + } + + // Material + var materials = xml.getElementsByTagName('material'); + if (materials.length > 0) { + this.material = new UrdfMaterial({ + xml : materials[0] + }); + } +} + +module.exports = UrdfVisual; +},{"../math/Pose":19,"../math/Quaternion":20,"../math/Vector3":22,"./UrdfBox":27,"./UrdfCylinder":29,"./UrdfMaterial":32,"./UrdfMesh":33,"./UrdfSphere":35}],38:[function(require,module,exports){ +module.exports = require('object-assign')({ + UrdfBox: require('./UrdfBox'), + UrdfColor: require('./UrdfColor'), + UrdfCylinder: require('./UrdfCylinder'), + UrdfLink: require('./UrdfLink'), + UrdfMaterial: require('./UrdfMaterial'), + UrdfMesh: require('./UrdfMesh'), + UrdfModel: require('./UrdfModel'), + UrdfSphere: require('./UrdfSphere'), + UrdfVisual: require('./UrdfVisual') +}, require('./UrdfTypes')); + +},{"./UrdfBox":27,"./UrdfColor":28,"./UrdfCylinder":29,"./UrdfLink":31,"./UrdfMaterial":32,"./UrdfMesh":33,"./UrdfModel":34,"./UrdfSphere":35,"./UrdfTypes":36,"./UrdfVisual":37,"object-assign":2}],39:[function(require,module,exports){ +(function (global){ +module.exports = global.WebSocket; +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],40:[function(require,module,exports){ +/* global document */ +module.exports = function Canvas() { + return document.createElement('canvas'); +}; +},{}],41:[function(require,module,exports){ +(function (global){ +/** + * @fileOverview + * @author Graeme Yeates - github.com/megawac + */ + +'use strict'; + +var Canvas = require('canvas'); +var Image = Canvas.Image || global.Image; + +/** + * If a message was compressed as a PNG image (a compression hack since + * gzipping over WebSockets * is not supported yet), this function places the + * "image" in a canvas element then decodes the * "image" as a Base64 string. + * + * @private + * @param data - object containing the PNG data. + * @param callback - function with params: + * * data - the uncompressed data + */ +function decompressPng(data, callback) { + // Uncompresses the data before sending it through (use image/canvas to do so). + var image = new Image(); + // When the image loads, extracts the raw data (JSON message). + image.onload = function() { + // Creates a local canvas to draw on. + var canvas = new Canvas(); + var context = canvas.getContext('2d'); + + // Sets width and height. + canvas.width = image.width; + canvas.height = image.height; + + // Prevents anti-aliasing and loosing data + context.imageSmoothingEnabled = false; + context.webkitImageSmoothingEnabled = false; + context.mozImageSmoothingEnabled = false; + + // Puts the data into the image. + context.drawImage(image, 0, 0); + // Grabs the raw, uncompressed data. + var imageData = context.getImageData(0, 0, image.width, image.height).data; + + // Constructs the JSON. + var jsonData = ''; + for (var i = 0; i < imageData.length; i += 4) { + // RGB + jsonData += String.fromCharCode(imageData[i], imageData[i + 1], imageData[i + 2]); + } + callback(JSON.parse(jsonData)); + }; + // Sends the image data to load. + image.src = 'data:image/png;base64,' + data; +} + +module.exports = decompressPng; +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"canvas":40}],42:[function(require,module,exports){ +(function (global){ +exports.DOMImplementation = global.DOMImplementation; +exports.XMLSerializer = global.XMLSerializer; +exports.DOMParser = global.DOMParser; +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}]},{},[4]); diff --git a/apps/ios/cleverrc/telemetry.js b/apps/ios/cleverrc/telemetry.js new file mode 100644 index 00000000..47e1f589 --- /dev/null +++ b/apps/ios/cleverrc/telemetry.js @@ -0,0 +1,85 @@ +var url = 'ws://192.168.11.1:9090'; +var modeEl = document.querySelector('.telemetry .mode'); +var batteryEl = document.querySelector('.battery'); + +var ros = new ROSLIB.Ros({ url: url }); + +ros.on('connection', function () { + body.classList.add('connected'); +}); + +ros.on('close', function () { + body.classList.remove('connected'); + modeEl.classList.remove('armed'); + modeEl.innerHTML = 'DISCONNECTED'; + batteryEl.innerHTML = ''; + setTimeout(function() { + modeEl.innerHTML = 'RECONNECTING'; + ros.connect(url); + }, 2000); +}); + +var fcuState; + +new ROSLIB.Topic({ + ros: ros, + name: '/state_latched', + messageType: 'mavros_msgs/State' +}).subscribe(function(message) { + body.classList.toggle('fcu-disconnected', !message.connected); + body.classList.toggle('armed', message.armed); + fcuState = message; + modeEl.classList.toggle('armed', fcuState.armed); + modeEl.innerHTML = message.connected ? fcuState.mode : 'DISCONNECTED FROM FCU'; + console.log('state', message); +}); + +function notifyLowBattery() { + callNativeApp('lowBattery'); +} + +notifyLowBatteryThrottled = throttle(notifyLowBattery, 10000); + +new ROSLIB.Topic({ + ros: ros, + name: '/mavros/battery', + messageType: 'sensor_msgs/BatteryState', + throttle_rate: 5000 +}).subscribe(function(message) { + var LOW_BATTERY = 3.8; + batteryEl.innerHTML = (message.cell_voltage[0].toFixed(2) + ' V') || ''; + + if (message.cell_voltage[0] < LOW_BATTERY) { + console.log('low battery'); + callNativeApp('lowBattery'); + body.classList.remove('low-battery'); + void body.offsetWidth; // trick for repeating animation + body.classList.add('low-battery'); + } else { + body.classList.remove('low-battery'); + } +}); + +new ROSLIB.Topic({ + ros: ros, + name: '/rosout_agg', + messageType: 'rosgraph_msgs/Log' +}).subscribe(function(message) { + if(message.level >= 4) { + if (message.msg.startsWith('CMD: ')) { + return; + } + callNativeApp('notification', message); + } +}); + +var setMode = new ROSLIB.Service({ + ros: ros, + name : '/mavros/set_mode', + serviceType : 'mavros_msgs/SetMode' +}); + +function setControlMode() { + var CONTROL_MODE = 'STABILIZED'; + setMode.callService(new ROSLIB.ServiceRequest({ custom_mode: CONTROL_MODE })); +} diff --git a/clever/CMakeLists.txt b/clever/CMakeLists.txt index a32e4da9..96c44158 100644 --- a/clever/CMakeLists.txt +++ b/clever/CMakeLists.txt @@ -11,6 +11,7 @@ find_package(catkin REQUIRED COMPONENTS nodelet pluginlib roscpp + genmsg rospy std_msgs message_generation @@ -157,7 +158,9 @@ add_library(aruco_vpe ## Declare a C++ executable ## With catkin_make all packages are built within a single CMake context ## The recommended prefix ensures that target names across packages don't collide -# add_executable(${PROJECT_NAME}_node src/clever_node.cpp) +add_executable(rc src/rc.cpp) + +target_link_libraries(rc ${catkin_LIBRARIES}) ## Rename C++ executable without prefix ## The above recommended prefix causes long target names, the following renames the diff --git a/clever/launch/clever.launch b/clever/launch/clever.launch index c89f32f1..6a582cfd 100644 --- a/clever/launch/clever.launch +++ b/clever/launch/clever.launch @@ -48,6 +48,9 @@ + + + diff --git a/clever/launch/mavros.launch b/clever/launch/mavros.launch index ae2a1c8c..d8a190f1 100644 --- a/clever/launch/mavros.launch +++ b/clever/launch/mavros.launch @@ -37,7 +37,6 @@ - 3dr_radio - actuator_control - hil_controls - - manual_control - vfr_hud - px4flow - vision_speed_estimate diff --git a/clever/src/rc.cpp b/clever/src/rc.cpp new file mode 100644 index 00000000..69f5a09f --- /dev/null +++ b/clever/src/rc.cpp @@ -0,0 +1,118 @@ +// CLEVER mobile remote control support: +// * Send ManualControl messages through UDP +// * `latched_state` topic + +#include +#include +#include +#include +#include "ros/ros.h" +#include "std_msgs/String.h" +#include "mavros_msgs/State.h" +#include "mavros_msgs/ManualControl.h" + +struct ControlMessage +{ + int16_t x, y, z, r; +} __attribute__((packed)); + +class RC +{ +public: + RC(): + nh(), + nh_priv("~") + { + // Create socket thread + std::thread t(&RC::socketThread, this); + t.detach(); + + initLatchedState(); + } + +private: + ros::NodeHandle nh, nh_priv; + ros::Subscriber state_sub; + ros::Publisher state_pub; + mavros_msgs::StateConstPtr state_msg; + + void handleState(const mavros_msgs::StateConstPtr& state) + { + if (!state_msg || + state->connected != state_msg->connected || + state->mode != state_msg->mode || + state->armed != state_msg->armed) { + state_msg = state; + state_pub.publish(state_msg); + } + } + + void initLatchedState() + { + state_sub = nh.subscribe("mavros/state", 1, &RC::handleState, this); + state_pub = nh.advertise("state_latched", 1, true); + } + + int createSocket(int port) + { + int sockfd = socket(AF_INET, SOCK_DGRAM, 0); + + sockaddr_in sin; + sin.sin_family = AF_INET; + sin.sin_addr.s_addr = htonl(INADDR_ANY); + sin.sin_port = htons(port); + + if (bind(sockfd, (sockaddr *)&sin, sizeof(sin)) < 0) { + ROS_FATAL("socket bind error: %s", strerror(errno)); + close(sockfd); + ros::shutdown(); + } + + return sockfd; + } + + void socketThread() + { + int port; + nh_priv.param("port", port, 35602); + int sockfd = createSocket(port); + + char buff[9999]; + + ros::Publisher manual_control_pub = nh.advertise("mavros/manual_control/send", 1); + mavros_msgs::ManualControl manual_control_msg; + + sockaddr_in client_addr; + socklen_t client_addr_size = sizeof(client_addr); + + ROS_INFO("UDP RC initialized on port %d", port); + + while (true) { + // read next UDP packet + int bsize = recvfrom(sockfd, &buff[0], sizeof(buff) - 1, 0, (sockaddr *) &client_addr, &client_addr_size); + + if (bsize < 0) { + ROS_ERROR("recvfrom() error: %s", strerror(errno)); + } else if (bsize != sizeof(ControlMessage)) { + ROS_ERROR_THROTTLE(30, "Wrong UDP packet size: %d", bsize); + } + + // unpack message + // warning: ignore endianness, so the code is platform-dependent + ControlMessage *msg = (ControlMessage *)buff; + + manual_control_msg.x = msg->x; + manual_control_msg.y = msg->y; + manual_control_msg.z = msg->z; + manual_control_msg.r = msg->r; + manual_control_pub.publish(manual_control_msg); + } + } +}; + +int main(int argc, char **argv) +{ + ros::init(argc, argv, "rc"); + RC rc; + ros::spin(); +} From 6448e6b928831c2abdd8f84ca4176e76308223be Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Mon, 19 Feb 2018 06:44:53 +0300 Subject: [PATCH 144/149] Add readme-file for ios-app --- apps/ios/cleverrc/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 apps/ios/cleverrc/README.md diff --git a/apps/ios/cleverrc/README.md b/apps/ios/cleverrc/README.md new file mode 100644 index 00000000..536d1dbd --- /dev/null +++ b/apps/ios/cleverrc/README.md @@ -0,0 +1,10 @@ +iOS-приложение для управления Клевером +-------------------------------------- + +Для установки зависимостей необходим [CocoaPods](https://cocoapods.org): + +```bash +pod install +``` + +Для разработки и сборки откройте в XCode файл `cleverrc.xcworkspace`. From bb792206cc6d4d52640562a43f86d76e7029c641 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Mon, 19 Feb 2018 06:44:53 +0300 Subject: [PATCH 145/149] Add readme-file for ios-app --- apps/ios/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 apps/ios/README.md diff --git a/apps/ios/README.md b/apps/ios/README.md new file mode 100644 index 00000000..536d1dbd --- /dev/null +++ b/apps/ios/README.md @@ -0,0 +1,10 @@ +iOS-приложение для управления Клевером +-------------------------------------- + +Для установки зависимостей необходим [CocoaPods](https://cocoapods.org): + +```bash +pod install +``` + +Для разработки и сборки откройте в XCode файл `cleverrc.xcworkspace`. From 51e4cbef3224ce7b96966749fd1b804f2f68b4a2 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Mon, 19 Feb 2018 07:00:57 +0300 Subject: [PATCH 146/149] Remove submodules --- .gitmodules | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 .gitmodules diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index d78ff0b3..00000000 --- a/.gitmodules +++ /dev/null @@ -1,4 +0,0 @@ -[submodule "clever/static"] - path = clever/static - url = https://github.com/CopterExpress/clever-rc.git - branch = build From c56b1040d487ce2124dbe2e303369894ed342ba6 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Mon, 19 Feb 2018 07:01:46 +0300 Subject: [PATCH 147/149] Remove static submodule --- clever/static | 1 - 1 file changed, 1 deletion(-) delete mode 160000 clever/static diff --git a/clever/static b/clever/static deleted file mode 160000 index 54c53043..00000000 --- a/clever/static +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 54c530431f1060cf21ceeb8f38a0ab914e570d8b From f544c32d6d317f414abde621ea35340cfb7f8a51 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Mon, 19 Feb 2018 15:17:27 +0300 Subject: [PATCH 148/149] Mark vendored files --- apps/ios/.gitattributes | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 apps/ios/.gitattributes diff --git a/apps/ios/.gitattributes b/apps/ios/.gitattributes new file mode 100644 index 00000000..32a84611 --- /dev/null +++ b/apps/ios/.gitattributes @@ -0,0 +1,2 @@ +cleverrc/roslib.js linguist-vendored +cleverrc/BinUtils.swift linguist-vendored From 2d0e06f22c0325f6fea7c2c79c35b98b0ff65f80 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Mon, 19 Feb 2018 15:47:31 +0300 Subject: [PATCH 149/149] Move .gitattributes file to the root --- .gitattributes | 2 ++ apps/ios/.gitattributes | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 .gitattributes delete mode 100644 apps/ios/.gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..7a394671 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +apps/ios/cleverrc/roslib.js linguist-vendored +apps/ios/cleverrc/BinUtils.swift linguist-vendored diff --git a/apps/ios/.gitattributes b/apps/ios/.gitattributes deleted file mode 100644 index 32a84611..00000000 --- a/apps/ios/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -cleverrc/roslib.js linguist-vendored -cleverrc/BinUtils.swift linguist-vendored