From e7eae1c02d8fe9894c8f67b36f17455b4d40cbb5 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Tue, 25 Jan 2022 19:12:17 +0300 Subject: [PATCH 1/4] ci: cancel previous docs builds to avoid publishing old site --- .github/workflows/docs.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 850fd262..cfdd99c7 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -10,6 +10,10 @@ jobs: docs: runs-on: ubuntu-18.04 steps: + - name: Cancel previous runs + uses: styfle/cancel-workflow-action@0.9.1 + with: + access_token: ${{ github.token }} - uses: actions/checkout@v2 - name: Use Node.js uses: actions/setup-node@v1 From 1aec5063d64160805f4344bbd5a348a24c1152af Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Fri, 28 Jan 2022 06:20:57 +0300 Subject: [PATCH 2/4] docs: simplify and fix some snippets --- docs/en/snippets.md | 40 +++++++--------------------------------- docs/ru/snippets.md | 43 +++++-------------------------------------- 2 files changed, 12 insertions(+), 71 deletions(-) diff --git a/docs/en/snippets.md b/docs/en/snippets.md index c22b8846..8af8ca29 100644 --- a/docs/en/snippets.md +++ b/docs/en/snippets.md @@ -8,13 +8,11 @@ -Fly towards a point and wait for copter's arrival: +Function to fly to a point and wait for copter's arrival: ```python import math -#... - def navigate_wait(x=0, y=0, z=0, yaw=float('nan'), speed=0.5, frame_id='', auto_arm=False, tolerance=0.2): navigate(x=x, y=y, z=z, yaw=yaw, speed=speed, frame_id=frame_id, auto_arm=auto_arm) @@ -64,8 +62,6 @@ Wait for copter's arrival to the [navigate](simple_offboard.md#navigate) target: ```python import math -# ... - def wait_arrival(tolerance=0.2): while not rospy.is_shutdown(): telem = get_telemetry(frame_id='navigate_target') @@ -79,6 +75,8 @@ def wait_arrival(tolerance=0.2): Calculate the distance between two points (**important**: the points are to be in the same [coordinate system](frames.md)): ```python +import math + def get_distance(x1, y1, z1, x2, y2, z2): return math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2 + (z1 - z2) ** 2) ``` @@ -88,6 +86,8 @@ def get_distance(x1, y1, z1, x2, y2, z2): Approximation of distance (in meters) between two global coordinates (latitude/longitude): ```python +import math + def get_distance_global(lat1, lon1, lat2, lon2): return math.hypot(lat1 - lat2, lon1 - lon2) * 1.113195e5 ``` @@ -203,19 +203,16 @@ from geometry_msgs.msg import PoseStamped, TwistStamped from sensor_msgs.msg import BatteryState from mavros_msgs.msg import RCIn -# ... - def pose_update(pose): # Processing new data of copter's position pass -# Other handler functions -# ... - rospy.Subscriber('/mavros/local_position/pose', PoseStamped, pose_update) rospy.Subscriber('/mavros/local_position/velocity', TwistStamped, velocity_update) rospy.Subscriber('/mavros/battery', BatteryState, battery_update) rospy.Subscriber('mavros/rc/in', RCIn, rc_callback) + +rospy.spin() ``` Information about MAVROS topics is available at [the link](mavros.md). @@ -229,18 +226,13 @@ Information about MAVROS topics is available at [the link](mavros.md). Send an arbitrary [MAVLink message](mavlink.md) to the copter: ```python -# ... - from mavros_msgs.msg import Mavlink from mavros import mavlink from pymavlink import mavutil -# ... - mavlink_pub = rospy.Publisher('mavlink/to', Mavlink, queue_size=1) # Sending a HEARTBEAT message: - msg = mavutil.mavlink.MAVLink_heartbeat_message(mavutil.mavlink.MAV_TYPE_GCS, 0, 0, 0, 0, 0) msg.pack(mavutil.mavlink.MAVLink('', 2, 1)) ros_msg = mavlink.convert_to_rosmsg(msg) @@ -281,8 +273,6 @@ Change the [flight mode](modes.md) to arbitrary one: ```python from mavros_msgs.srv import SetMode -# ... - set_mode = rospy.ServiceProxy('mavros/set_mode', SetMode) # ... @@ -297,8 +287,6 @@ Flip: ```python import math -# ... - PI_2 = math.pi / 2 def flip(): @@ -337,8 +325,6 @@ from pymavlink import mavutil from mavros_msgs.srv import CommandLong from mavros_msgs.msg import State -# ... - send_command = rospy.ServiceProxy('/mavros/cmd/command', CommandLong) def calibrate_gyro(): @@ -372,8 +358,6 @@ Enable and disable [ArUco markers recognition](aruco_marker.md) dynamically (for import rospy import dynamic_reconfigure.client -# ... - client = dynamic_reconfigure.client.Client('aruco_detect') # Turn markers recognition off @@ -392,8 +376,6 @@ Wait for global position to appear (finishing [GPS receiver](gps.md) initializat ```python import math -# ... - while not rospy.is_shutdown(): if math.isfinite(get_telemetry().lat): break @@ -408,12 +390,8 @@ Read flight controller's parameter: from mavros_msgs.srv import ParamGet from mavros_msgs.msg import ParamValue -# ... - param_get = rospy.ServiceProxy('mavros/param/get', ParamGet) -# ... - # Read parameter of type INT value = param_get(param_id='COM_FLTMODE1').value.integer @@ -429,12 +407,8 @@ Set flight controller's parameter: from mavros_msgs.srv import ParamSet from mavros_msgs.msg import ParamValue -# ... - param_set = rospy.ServiceProxy('mavros/param/set', ParamSet) -# ... - # Set parameter of type INT: param_set(param_id='COM_FLTMODE1', value=ParamValue(integer=8)) diff --git a/docs/ru/snippets.md b/docs/ru/snippets.md index 1dd3a726..de2eee9b 100644 --- a/docs/ru/snippets.md +++ b/docs/ru/snippets.md @@ -17,13 +17,11 @@ -Полет в точку и ожидание окончания полета: +Функция для полета в точку и ожидание окончания полета: ```python import math -# ... - def navigate_wait(x=0, y=0, z=0, yaw=float('nan'), speed=0.5, frame_id='', auto_arm=False, tolerance=0.2): navigate(x=x, y=y, z=z, yaw=yaw, speed=speed, frame_id=frame_id, auto_arm=auto_arm) @@ -74,8 +72,6 @@ land_wait() ```python import math -# ... - def wait_arrival(tolerance=0.2): while not rospy.is_shutdown(): telem = get_telemetry(frame_id='navigate_target') @@ -91,8 +87,6 @@ def wait_arrival(tolerance=0.2): ```python import math -# ... - def get_distance(x1, y1, z1, x2, y2, z2): return math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2 + (z1 - z2) ** 2) ``` @@ -104,8 +98,6 @@ def get_distance(x1, y1, z1, x2, y2, z2): ```python import math -# ... - def get_distance_global(lat1, lon1, lat2, lon2): return math.hypot(lat1 - lat2, lon1 - lon2) * 1.113195e5 ``` @@ -221,19 +213,16 @@ from geometry_msgs.msg import PoseStamped, TwistStamped from sensor_msgs.msg import BatteryState from mavros_msgs.msg import RCIn -# ... - def pose_update(pose): # Обработка новых данных о позиции коптера pass -# Остальные функции-обработчики -# ... - rospy.Subscriber('/mavros/local_position/pose', PoseStamped, pose_update) rospy.Subscriber('/mavros/local_position/velocity', TwistStamped, velocity_update) rospy.Subscriber('/mavros/battery', BatteryState, battery_update) rospy.Subscriber('mavros/rc/in', RCIn, rc_callback) + +rospy.spin() ``` Информацию по топикам MAVROS см. по [ссылке](mavros.md). @@ -247,14 +236,10 @@ rospy.Subscriber('mavros/rc/in', RCIn, rc_callback) Пример отправки произвольного [MAVLink-сообщения](mavlink.md) коптеру: ```python -# ... - from mavros_msgs.msg import Mavlink from mavros import mavlink from pymavlink import mavutil -# ... - mavlink_pub = rospy.Publisher('mavlink/to', Mavlink, queue_size=1) # Отправка сообщения HEARTBEAT: @@ -299,8 +284,6 @@ rospy.spin() ```python from mavros_msgs.srv import SetMode -# ... - set_mode = rospy.ServiceProxy('mavros/set_mode', SetMode) # ... @@ -315,8 +298,6 @@ set_mode(custom_mode='STABILIZED') ```python import math -# ... - PI_2 = math.pi / 2 def flip(): @@ -355,8 +336,6 @@ from pymavlink import mavutil from mavros_msgs.srv import CommandLong from mavros_msgs.msg import State -# ... - send_command = rospy.ServiceProxy('/mavros/cmd/command', CommandLong) def calibrate_gyro(): @@ -390,16 +369,14 @@ calibrate_gyro() import rospy import dynamic_reconfigure.client -# ... - client = dynamic_reconfigure.client.Client('aruco_detect') -# Turn markers recognition off +# Включить распознавание маркеров client.update_configuration({'enabled': False}) rospy.sleep(5) -# Turn markers recognition on +# Выключить распознавание маркеров client.update_configuration({'enabled': True}) ``` @@ -410,8 +387,6 @@ client.update_configuration({'enabled': True}) ```python import math -# ... - while not rospy.is_shutdown(): if math.isfinite(get_telemetry().lat): break @@ -426,12 +401,8 @@ while not rospy.is_shutdown(): from mavros_msgs.srv import ParamGet from mavros_msgs.msg import ParamValue -# ... - param_get = rospy.ServiceProxy('mavros/param/get', ParamGet) -# ... - # Считать параметр типа INT value = param_get(param_id='COM_FLTMODE1').value.integer @@ -447,12 +418,8 @@ value = param_get(param_id='MPC_Z_P').value.float from mavros_msgs.srv import ParamSet from mavros_msgs.msg import ParamValue -# ... - param_set = rospy.ServiceProxy('mavros/param/set', ParamSet) -# ... - # Изменить параметр типа INT: param_set(param_id='COM_FLTMODE1', value=ParamValue(integer=8)) From bf9f7d035fc5ecd024802877199c33836070fe73 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Fri, 28 Jan 2022 06:21:53 +0300 Subject: [PATCH 3/4] docs: edit programming intro text --- docs/ru/programming.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/ru/programming.md b/docs/ru/programming.md index 8767735c..d2e2b0a4 100644 --- a/docs/ru/programming.md +++ b/docs/ru/programming.md @@ -2,7 +2,7 @@ -Платформа Клевера позволяет использовать [Raspberry Pi](raspberry.md) для того, чтобы запрограммировать автономный полет дрона. Чаще всего программа для автономного полета пишется на языке Python. Программа может [получать телеметрию](simple_offboard.md#get_telemetry) (заряд батареи, ориентацию, расположение и т. д.) и отправлять команды: [полететь в точку](simple_offboard.md#navigate), [установить ориентацию](simple_offboard.md#set_attitude), [угловую скорость](simple_offboard.md#set_rates) и т. д. +Платформа Клевера позволяет использовать [Raspberry Pi](raspberry.md) для того, чтобы запрограммировать автономный полет дрона. Чаще всего программа для автономного полета пишется на языке Python. Программа может [получать телеметрию](simple_offboard.md#get_telemetry) (заряд батареи, ориентацию, положение, скорости) и отправлять команды, например: [полететь в точку](simple_offboard.md#navigate), [установить ориентацию](simple_offboard.md#set_attitude), [установить угловую скорость](simple_offboard.md#set_rates). Платформа основывается на [фреймворке ROS](ros.md), который обеспечивает связь между пользовательской программой и сервисами Клевера, которые запущены в фоне в виде systemd-демона `clover`. Для связи с полетным контроллером используется пакет [MAVROS](mavros.md). @@ -10,7 +10,7 @@ ## Система позиционирования {#positioning} -Для того, чтобы дрон мог зависать на месте или летать между точками, необходимо использование системы позиционирования. Такая система должна вычислять и сообщать дрону, где он находится. Клевер предполагает использование нескольких систем позиционирования: [optical flow](optical_flow.md) (используется [камера](camera.md) и [лазерный дальномер](laser.md)), [визуальные маркеры](aruco.md) (используется камера и маркеры, наклеенные на пол или потолок), GPS и других. +Для того, чтобы дрон мог зависать на месте или летать между точками, необходимо использование системы позиционирования. Такая система вычисляет и сообщает дрону, где он находится. Клевер предполагает использование нескольких систем позиционирования: [optical flow](optical_flow.md) (используется [камера](camera.md) и [лазерный дальномер](laser.md)), [визуальные маркеры](aruco.md) (используется камера и маркеры, наклеенные на пол или потолок), GPS и других. ### Optical flow @@ -32,7 +32,7 @@ ## Автономный полет {#flight} -> **Info** Для изучения языка программирования Python вы можете обратиться к [самоучителю](https://pythonworld.ru/samouchitel-python). +> **Info** Для изучения языка программирования Python можно обратиться к [самоучителю](https://pythonworld.ru/samouchitel-python). После настройки системы позиционирования становится возможным написание скриптов для автономных полетов. Для выполнения скриптов [подключитесь в Raspberry Pi по SSH](ssh.md). From d18ca32688af5f05b6c27e5baed2fb3ff411e89b Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Fri, 28 Jan 2022 08:08:41 +0300 Subject: [PATCH 4/4] www: add console page to show logs --- clover/www/console.html | 23 +++++++++++++++++++++++ clover/www/index.html | 2 +- 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 clover/www/console.html diff --git a/clover/www/console.html b/clover/www/console.html new file mode 100644 index 00000000..a094f328 --- /dev/null +++ b/clover/www/console.html @@ -0,0 +1,23 @@ +

+ /var/log/clover.log + download +

+ +

+
+
diff --git a/clover/www/index.html b/clover/www/index.html
index 80edcb85..bee1d096 100644
--- a/clover/www/index.html
+++ b/clover/www/index.html
@@ -9,7 +9,7 @@
 	
  • Open web terminal (Butterfly)
  • View View 3D visualization, 3D visualization for markers map (ros3djs)
  • Blocks programming (Blockly)
  • -
  • Clover console (/var/log/clover.log)
  • +
  • Clover console (/var/log/clover.log)