diff --git a/README.md b/README.md
index 0f9c156a..2e695db1 100644
--- a/README.md
+++ b/README.md
@@ -20,7 +20,7 @@ Clover drone is used on a wide range of educational events, including [Copter Ha
Preconfigured image for Raspberry Pi with installed and configured software, ready to fly, is available [in the Releases section](https://github.com/CopterExpress/clover/releases).
-
+

Image features:
diff --git a/clover/launch/clover.launch b/clover/launch/clover.launch
index 68150d49..c78297d6 100644
--- a/clover/launch/clover.launch
+++ b/clover/launch/clover.launch
@@ -45,7 +45,7 @@
-
+
diff --git a/clover_blocks/www/python.js b/clover_blocks/www/python.js
index a614e5e3..42de72a2 100644
--- a/clover_blocks/www/python.js
+++ b/clover_blocks/www/python.js
@@ -83,9 +83,6 @@ function generateROSDefinitions() {
if (rosDefinitions.navigateGlobal) {
code += `navigate_global = rospy.ServiceProxy('navigate_global', srv.NavigateGlobal)\n`;
}
- if (rosDefinitions.setYaw) {
- code += `set_yaw = rospy.ServiceProxy('set_yaw', srv.SetYaw)\n`;
- }
if (rosDefinitions.setVelocity) {
code += `set_velocity = rospy.ServiceProxy('set_velocity', srv.SetVelocity)\n`;
}
diff --git a/docs/en/SUMMARY.md b/docs/en/SUMMARY.md
index ab2c3239..1dd04778 100644
--- a/docs/en/SUMMARY.md
+++ b/docs/en/SUMMARY.md
@@ -36,7 +36,7 @@
* [Optical Flow](optical_flow.md)
* [Autonomous flight (OFFBOARD)](simple_offboard.md)
* [Coordinate systems (frames)](frames.md)
- * [Code snippets](snippets.md)
+ * [Code examples](snippets.md)
* [Interfacing with a laser rangefinder](laser.md)
* [LED strip](leds.md)
* [Working with GPIO](gpio.md)
diff --git a/docs/en/camera.md b/docs/en/camera.md
index ba0dbd3a..a4079a45 100644
--- a/docs/en/camera.md
+++ b/docs/en/camera.md
@@ -14,7 +14,7 @@ The `clover` service must be restarted after the launch-file has been edited:
sudo systemctl restart clover
```
-You may use rqt or [web_video_server](web_video_server.md) to view the camera stream.
+You may use [rqt](rviz.md) or [web_video_server](web_video_server.md) to view the camera stream.
## Troubleshooting
@@ -52,8 +52,6 @@ The [SD card image](image.md) comes with a preinstalled [OpenCV](https://opencv.
### Python
-Main article: http://wiki.ros.org/cv_bridge/Tutorials/ConvertingBetweenROSImagesAndOpenCVImagesPython.
-
An example of creating a subscriber for a topic with an image from the main camera for processing with OpenCV:
```python
@@ -61,12 +59,14 @@ import rospy
import cv2
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
+from clover import long_callback
-rospy.init_node('computer_vision_sample')
+rospy.init_node('cv')
bridge = CvBridge()
+@long_callback
def image_callback(data):
- cv_image = bridge.imgmsg_to_cv2(data, 'bgr8') # OpenCV image
+ img = bridge.imgmsg_to_cv2(data, 'bgr8') # OpenCV image
# Do any image processing with cv2...
image_sub = rospy.Subscriber('main_camera/image_raw', Image, image_callback)
@@ -74,19 +74,31 @@ image_sub = rospy.Subscriber('main_camera/image_raw', Image, image_callback)
rospy.spin()
```
+> **Note** Image processing may take significant time to finish. This can cause an [issue](https://github.com/ros/ros_comm/issues/1901) in rospy library, which would lead to processing stale camera frames. To solve this problem you need to use `long_callback` decorator from `clover` library, as in the example above.
+
+#### Limiting CPU usage
+
+When using the `main_camera/image_raw` topic, the script will process the maximum number of frames from the camera, actively utilizing the CPU (up to 100%). In tasks, where processing each camera frame is not critical, you can use the topic, where the frames are published at rate 5 Hz: `main_camera/image_raw_throttled`:
+
+```python
+image_sub = rospy.Subscriber('main_camera/image_raw_throttled', Image, image_callback, queue_size=1)
+```
+
+#### Publishing images
+
To debug image processing, you can publish a separate topic with the processed image:
```python
image_pub = rospy.Publisher('~debug', Image)
```
-Publishing the processed image (at the end of the image_callback function):
+Publishing the processed image:
```python
-image_pub.publish(bridge.cv2_to_imgmsg(cv_image, 'bgr8'))
+image_pub.publish(bridge.cv2_to_imgmsg(img, 'bgr8'))
```
-The obtained images can be viewed using [web_video_server](web_video_server.md).
+The published images can be viewed using [web_video_server](web_video_server.md) or [rqt](rviz.md).
#### Retrieving one frame
@@ -97,7 +109,7 @@ import rospy
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
-rospy.init_node('computer_vision_sample')
+rospy.init_node('cv')
bridge = CvBridge()
# ...
@@ -119,40 +131,32 @@ QR codes recognition in Python:
```python
import rospy
from pyzbar import pyzbar
+import cv2
from cv_bridge import CvBridge
from sensor_msgs.msg import Image
+from clover import long_callback
+rospy.init_node('cv')
bridge = CvBridge()
-rospy.init_node('barcode_test')
-
-# Image subscriber callback function
-def image_callback(data):
- cv_image = bridge.imgmsg_to_cv2(data, 'bgr8') # OpenCV image
- barcodes = pyzbar.decode(cv_image)
+@long_callback
+def image_callback(msg):
+ img = bridge.imgmsg_to_cv2(msg, 'bgr8')
+ barcodes = pyzbar.decode(img)
for barcode in barcodes:
- b_data = barcode.data.decode("utf-8")
+ b_data = barcode.data.decode('utf-8')
b_type = barcode.type
(x, y, w, h) = barcode.rect
xc = x + w/2
yc = y + h/2
- print("Found {} with data {} with center at x={}, y={}".format(b_type, b_data, xc, yc))
+ print('Found {} with data {} with center at x={}, y={}'.format(b_type, b_data, xc, yc))
-image_sub = rospy.Subscriber('main_camera/image_raw', Image, image_callback, queue_size=1)
+image_sub = rospy.Subscriber('main_camera/image_raw_throttled', Image, image_callback, queue_size=1)
rospy.spin()
```
-The script will take up to 100% CPU capacity. To slow down the script artificially, you can use [throttling](http://wiki.ros.org/topic_tools/throttle) of frames from the camera, for example, at 5 Hz (`main_camera.launch`):
-
-> **Note** Starting from [image](image.md) version **0.24** `image_raw_throttled` topic is available without addition configuration.
-
-```xml
-
-```
-
-The topic for the subscriber in this case should be changed for `main_camera/image_raw_throttled`.
+> **Hint** See other computer vision examples in the `~/examples` directory of the [RPi image](image.md).
## Video recording
diff --git a/docs/en/copterhack2023.md b/docs/en/copterhack2023.md
index 89284d3a..d53ca911 100644
--- a/docs/en/copterhack2023.md
+++ b/docs/en/copterhack2023.md
@@ -22,7 +22,7 @@ The proposed projects are supposed to be open-source and be compatible with the
||π°π¬ LiveSavers|[LiveSavers](https://github.com/Sarvar00/clover/blob/livesavers/docs/ru/livesaver.md)||
||π·πΊ C305|[Π‘ΠΈΡΡΠ΅ΠΌΠ° ΡΠ°Π΄ΠΈΠΎ-Π½Π°Π²ΠΈΠ³Π°ΡΠΈΠΈ](https://github.com/Lukerrr/clover-c305/blob/nav_beacon/docs/ru/nav-beacon.md)||
||π·πΊ XenCOM|[Bound by fate](https://github.com/xenkek/clover/blob/xenkek-patch-1/docs/ru/bound_by_fate.md)||
-||π¨π¦ Clover with Motion Capture System|[Clover with Motion Capture System](https://github.com/ssmith-81/clover/blob/MoCap_Clover/docs/en/MoCap-Clover)||
+||π¨π¦ Clover with Motion Capture System|[Clover with Motion Capture System](https://github.com/ssmith-81/clover/blob/MoCap_Clover/docs/en/mocap_clover.md)||
||π§π· Atena|[Swarm in Blocks 2](https://github.com/Grupo-SEMEAR-USP/clover/blob/swarm_in_blocks_2/docs/en/swarm_in_blocks_2.md)||
||π§πΎ FTL|[Advanced Clover 2](https://github.com/FTL-team/clover/blob/FTL-advancedClover3/docs/ru/advanced_clover_simulator_platform.md)||
||π·πΊ ΠΠΈΡΠ΅ΠΉ β128|[ΠΠ»Π°ΡΡΠΎΡΠΌΠ° Π΄Π»Ρ Π·Π°ΡΡΠ΄ΠΊΠΈ ΠΊΠ²Π°Π΄ΡΠΎΠΊΠΎΠΏΡΠ΅ΡΠ°](https://github.com/Juli-Shvetsova/clover/blob/liceu128-1/docs/ru/liceu128.md)||
diff --git a/docs/ru/camera.md b/docs/ru/camera.md
index 0f9b6a14..ea4082c6 100644
--- a/docs/ru/camera.md
+++ b/docs/ru/camera.md
@@ -54,8 +54,6 @@ raspistill -o test.jpg
### Python
-ΠΡΠ½ΠΎΠ²Π½Π°Ρ ΡΡΠ°ΡΡΡ: http://wiki.ros.org/cv_bridge/Tutorials/ConvertingBetweenROSImagesAndOpenCVImagesPython.
-
ΠΡΠΈΠΌΠ΅Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΠ° Π½Π° ΡΠΎΠΏΠΈΠΊ Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΊΠ°ΠΌΠ΅ΡΡ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ OpenCV:
```python
@@ -63,12 +61,14 @@ import rospy
import cv2
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
+from clover import long_callback
-rospy.init_node('computer_vision_sample')
+rospy.init_node('cv')
bridge = CvBridge()
+@long_callback
def image_callback(data):
- cv_image = bridge.imgmsg_to_cv2(data, 'bgr8') # OpenCV image
+ img = bridge.imgmsg_to_cv2(data, 'bgr8') # OpenCV image
# Do any image processing with cv2...
image_sub = rospy.Subscriber('main_camera/image_raw', Image, image_callback)
@@ -76,19 +76,31 @@ image_sub = rospy.Subscriber('main_camera/image_raw', Image, image_callback)
rospy.spin()
```
+> **Note** ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π·Π°Π½ΠΈΠΌΠ°ΡΡ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ·Π²Π°ΡΡ [ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ](https://github.com/ros/ros_comm/issues/1901) Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ rospy, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ²Π΅Π΄Π΅Ρ ΠΊ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΡ
ΠΊΠ°Π΄ΡΠΎΠ² Ρ ΠΊΠ°ΠΌΠ΅ΡΡ. ΠΠ»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡ `long_callback` ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ `clover`, ΠΊΠ°ΠΊ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π²ΡΡΠ΅.
+
+#### ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ CPU
+
+ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠΎΠΏΠΈΠΊΠ° `main_camera/image_raw` ΡΠΊΡΠΈΠΏΡ Π±ΡΠ΄Π΅Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠ°Π΄ΡΠΎΠ² Ρ ΠΊΠ°ΠΌΠ΅ΡΡ, Π°ΠΊΡΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ CPU (Π²ΠΏΠ»ΠΎΡΡ Π΄ΠΎ 100%). Π Π·Π°Π΄Π°ΡΠ°Ρ
, Π³Π΄Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ°Π΄ΡΠ° Π½Π΅ ΠΊΡΠΈΡΠΈΡΠ½Π°, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΎΠΏΠΈΠΊ, Π³Π΄Π΅ ΠΊΠ°Π΄ΡΡ ΠΏΡΠ±Π»ΠΈΠΊΡΡΡΡΡ Ρ ΡΠ°ΡΡΠΎΡΠΎΠΉ 5 ΠΡ: `main_camera/image_raw_throttled`:
+
+```python
+image_sub = rospy.Subscriber('main_camera/image_raw_throttled', Image, image_callback, queue_size=1)
+```
+
+#### ΠΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ
+
ΠΠ»Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΠΎΠΏΠΈΠΊ Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½Π½ΡΠΌ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ:
```python
image_pub = rospy.Publisher('~debug', Image)
```
-ΠΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½Π½ΠΎΠ³ΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ (Π² ΠΊΠΎΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ image_callback):
+ΠΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½Π½ΠΎΠ³ΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ:
```python
-image_pub.publish(bridge.cv2_to_imgmsg(cv_image, 'bgr8'))
+image_pub.publish(bridge.cv2_to_imgmsg(img, 'bgr8'))
```
-ΠΠΎΠ»ΡΡΠ°Π΅ΠΌΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ [web_video_server](web_video_server.md).
+ΠΠΎΠ»ΡΡΠ°Π΅ΠΌΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ [web_video_server](web_video_server.md) ΠΈΠ»ΠΈ [rqt](rviz.md).
#### ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ°Π΄ΡΠ°
@@ -99,12 +111,12 @@ import rospy
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
-rospy.init_node('computer_vision_sample')
+rospy.init_node('cv')
bridge = CvBridge()
# ...
-# ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠ°Π΄ΡΠ°:
+# Retrieve a frame:
img = bridge.imgmsg_to_cv2(rospy.wait_for_message('main_camera/image_raw', Image), 'bgr8')
```
@@ -121,40 +133,32 @@ img = bridge.imgmsg_to_cv2(rospy.wait_for_message('main_camera/image_raw', Image
```python
import rospy
from pyzbar import pyzbar
+import cv2
from cv_bridge import CvBridge
from sensor_msgs.msg import Image
+from clover import long_callback
+rospy.init_node('cv')
bridge = CvBridge()
-rospy.init_node('barcode_test')
-
-# Image subscriber callback function
-def image_callback(data):
- cv_image = bridge.imgmsg_to_cv2(data, 'bgr8') # OpenCV image
- barcodes = pyzbar.decode(cv_image)
+@long_callback
+def image_callback(msg):
+ img = bridge.imgmsg_to_cv2(msg, 'bgr8')
+ barcodes = pyzbar.decode(img)
for barcode in barcodes:
- b_data = barcode.data.decode("utf-8")
+ b_data = barcode.data.decode('utf-8')
b_type = barcode.type
(x, y, w, h) = barcode.rect
xc = x + w/2
yc = y + h/2
- print("Found {} with data {} with center at x={}, y={}".format(b_type, b_data, xc, yc))
+ print('Found {} with data {} with center at x={}, y={}'.format(b_type, b_data, xc, yc))
-image_sub = rospy.Subscriber('main_camera/image_raw', Image, image_callback, queue_size=1)
+image_sub = rospy.Subscriber('main_camera/image_raw_throttled', Image, image_callback, queue_size=1)
rospy.spin()
```
-Π‘ΠΊΡΠΈΠΏΡ Π±ΡΠ΄Π΅Ρ Π·Π°Π½ΠΈΠΌΠ°ΡΡ 100% ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°. ΠΠ»Ρ ΠΈΡΠΊΡΡΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ Π·Π°ΠΌΠ΅Π΄Π»Π΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ ΡΠΊΡΠΈΠΏΡΠ° ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ [throttling](http://wiki.ros.org/topic_tools/throttle) ΠΊΠ°Π΄ΡΠΎΠ² Ρ ΠΊΠ°ΠΌΠ΅ΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² 5 ΠΡ (`main_camera.launch`):
-
-> **Note** ΠΠ°ΡΠΈΠ½Π°Ρ Ρ Π²Π΅ΡΡΠΈΠΈ [ΠΎΠ±ΡΠ°Π·Π°](image.md) **0.24** ΡΠΎΠΏΠΈΠΊ `image_raw_throttled` Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ.
-
-```xml
-
-```
-
-Π’ΠΎΠΏΠΈΠΊ Π΄Π»Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΠ° Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡΡ Π½Π° `main_camera/image_raw_throttled`.
+> **Hint** Π‘ΠΌΠΎΡΡΠΈΡΠ΅ Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΏΠΎ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ½ΡΠΌ Π·ΡΠ΅Π½ΠΈΠ΅ΠΌ Π² ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅ `~/examples` [ΠΎΠ±ΡΠ°Π·Π° Π΄Π»Ρ RPi](image.md).
## ΠΠ°ΠΏΠΈΡΡ Π²ΠΈΠ΄Π΅ΠΎ
diff --git a/docs/ru/copterhack2023.md b/docs/ru/copterhack2023.md
index a3225844..0d3ca4af 100644
--- a/docs/ru/copterhack2023.md
+++ b/docs/ru/copterhack2023.md
@@ -22,7 +22,7 @@ CopterHack 2023 β ΡΡΠΎΒ ΠΌΠ΅ΠΆΠ΄ΡΠ½Π°ΡΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ½ΠΊΡΡΡ ΠΏΠΎ ΡΠ°
||π°π¬ LiveSavers|[LiveSavers](https://github.com/Sarvar00/clover/blob/livesavers/docs/ru/livesaver.md)||
||π·πΊ C305|[Π‘ΠΈΡΡΠ΅ΠΌΠ° ΡΠ°Π΄ΠΈΠΎ-Π½Π°Π²ΠΈΠ³Π°ΡΠΈΠΈ](https://github.com/Lukerrr/clover-c305/blob/nav_beacon/docs/ru/nav-beacon.md)||
||π·πΊ XenCOM|[Bound by fate](https://github.com/xenkek/clover/blob/xenkek-patch-1/docs/ru/bound_by_fate.md)||
-||π¨π¦ Clover with Motion Capture System|[Clover with Motion Capture System](https://github.com/ssmith-81/clover/blob/MoCap_Clover/docs/en/MoCap-Clover)||
+||π¨π¦ Clover with Motion Capture System|[Clover with Motion Capture System](https://github.com/ssmith-81/clover/blob/MoCap_Clover/docs/en/mocap_clover.md)||
||π§π· Atena|[Swarm in Blocks 2](https://github.com/Grupo-SEMEAR-USP/clover/blob/swarm_in_blocks_2/docs/en/swarm_in_blocks_2.md)||
||π§πΎ FTL|[Advanced Clover 2](https://github.com/FTL-team/clover/blob/FTL-advancedClover3/docs/ru/advanced_clover_simulator_platform.md)||
||π·πΊ ΠΠΈΡΠ΅ΠΉ β128|[ΠΠ»Π°ΡΡΠΎΡΠΌΠ° Π΄Π»Ρ Π·Π°ΡΡΠ΄ΠΊΠΈ ΠΊΠ²Π°Π΄ΡΠΎΠΊΠΎΠΏΡΠ΅ΡΠ°](https://github.com/Juli-Shvetsova/clover/blob/liceu128-1/docs/ru/liceu128.md)||