diff --git a/aruco_pose/cfg/Detector.cfg b/aruco_pose/cfg/Detector.cfg index 581bc2622..98a29dce6 100755 --- a/aruco_pose/cfg/Detector.cfg +++ b/aruco_pose/cfg/Detector.cfg @@ -4,7 +4,10 @@ PACKAGE = "aruco_pose" from dynamic_reconfigure.parameter_generator_catkin import * import cv2.aruco -p = cv2.aruco.DetectorParameters_create() +try: + p = cv2.aruco.DetectorParameters_create() +except AttributeError: + p = cv2.aruco.DetectorParameters() gen = ParameterGenerator() diff --git a/builder/image-ros.sh b/builder/image-ros.sh index 941432a4a..ef38c6113 100755 --- a/builder/image-ros.sh +++ b/builder/image-ros.sh @@ -138,7 +138,9 @@ my_travis_retry apt-get install -y --no-install-recommends \ ros-${ROS_DISTRO}-rosshow \ ros-${ROS_DISTRO}-cmake-modules \ ros-${ROS_DISTRO}-image-view \ - ros-${ROS_DISTRO}-image-geometry + ros-${ROS_DISTRO}-image-geometry \ + ros-${ROS_DISTRO}-nodelet-topic-tools \ + ros-${ROS_DISTRO}-stereo-msgs # TODO move GeographicLib datasets to Mavros debian package echo_stamp "Install GeographicLib datasets (needed for mavros)" \ diff --git a/check_assets_size.py b/check_assets_size.py index ae52b9678..c6055b989 100755 --- a/check_assets_size.py +++ b/check_assets_size.py @@ -18,7 +18,7 @@ def human_size(num, suffix='B'): 'qgc-battery.png', 'qgc-radio.png', 'qgc-cal-acc.png', 'qgc-esc.png', 'qgc-cal-compass.png', \ 'qgc.png', 'qgc-parameters.png', 'clever4-front-white-large.png', 'qgc-modes.png', \ 'qgc-requires-setup.png', 'clever4-front-white.png', 'clever4-kit-white.png', '26_1.png', 'battery_holder.stl', \ - 'camera_case.stl', 'camera_mount.stl' + 'camera_case.stl', 'camera_mount.stl', 'grip_right.stl', 'grip_left.stl' code = 0 diff --git a/clover/launch/led.launch b/clover/launch/led.launch index 3e9238979..c2923ce95 100644 --- a/clover/launch/led.launch +++ b/clover/launch/led.launch @@ -21,7 +21,8 @@ - + + diff --git a/clover/launch/main_camera.launch b/clover/launch/main_camera.launch index 8e932ce48..0b97e1dda 100644 --- a/clover/launch/main_camera.launch +++ b/clover/launch/main_camera.launch @@ -6,6 +6,7 @@ + @@ -49,4 +50,11 @@ + + + + + + + diff --git a/clover/package.xml b/clover/package.xml index 98bfbfb39..397ea808a 100644 --- a/clover/package.xml +++ b/clover/package.xml @@ -42,6 +42,7 @@ python-lxml python3-lxml dynamic_reconfigure + image_proc python-pymavlink ros_pytest diff --git a/clover/src/led.cpp b/clover/src/led.cpp index 91438df3d..b9927900f 100644 --- a/clover/src/led.cpp +++ b/clover/src/led.cpp @@ -309,15 +309,19 @@ int main(int argc, char **argv) nh_priv.param("notify/low_battery/threshold", low_battery_threshold, 3.7); nh_priv.param("notify/error/ignore", error_ignore, {}); - ros::service::waitForService("set_leds"); // cannot work without set_leds service - set_leds_srv = nh.serviceClient("set_leds", true); + std::string led; // led namespace + nh_priv.param("led", led, std::string("led")); + if (!led.empty()) led += "/"; + + ros::service::waitForService(led + "set_leds"); // cannot work without set_leds service + set_leds_srv = nh.serviceClient(led + "set_leds", true); // wait for leds count info - handleState(*ros::topic::waitForMessage("state", nh)); + handleState(*ros::topic::waitForMessage(led + "state", nh)); - auto state_sub = nh.subscribe("state", 1, &handleState); + auto state_sub = nh.subscribe(led + "state", 1, &handleState); - auto set_effect = nh.advertiseService("set_effect", &setEffect); + auto set_effect = nh.advertiseService(led + "set_effect", &setEffect); auto mavros_state_sub = nh.subscribe("mavros/state", 1, &handleMavrosState); auto battery_sub = nh.subscribe("mavros/battery", 1, &handleBattery); diff --git a/clover/src/selfcheck.py b/clover/src/selfcheck.py index 371dc8b5a..274594b79 100755 --- a/clover/src/selfcheck.py +++ b/clover/src/selfcheck.py @@ -107,7 +107,7 @@ def ff(value, precision=2): param_get = rospy.ServiceProxy('mavros/param/get', ParamGet) -def get_param(name, default=None): +def get_param(name, default=None, strict=True): try: res = param_get(param_id=name) except rospy.ServiceException as e: @@ -115,7 +115,8 @@ def get_param(name, default=None): return None if not res.success: - failure('unable to retrieve PX4 parameter %s', name) + if strict: + failure('unable to retrieve PX4 parameter %s', name) return default else: if res.value.integer != 0: @@ -263,7 +264,7 @@ def check_fcu(): est = get_param('SYS_MC_EST_GROUP') if est == 1: info('selected estimator: LPE') - fuse = get_param('LPE_FUSION') + fuse = int(get_param('LPE_FUSION')) if fuse & (1 << 4): info('LPE_FUSION: land detector fusion is enabled') else: @@ -316,7 +317,13 @@ def check_fcu(): failure('cannot read time sync offset') except rospy.ROSException: - failure('no MAVROS state (check wiring)') + failure('no MAVROS state') + fcu_url = rospy.get_param('mavros/fcu_url', '?') + if fcu_url == '/dev/px4fmu': + if not os.path.exists('/lib/udev/rules.d/99-px4fmu.rules'): + info('udev rules are not installed, install udev rules or change usb_device to /dev/ttyACM0 in mavros.launch') + else: + info('udev did\'t recognize px4fmu device, check wiring or change usb_device to /dev/ttyACM0 in mavros.launch') info('fcu_url = %s', rospy.get_param('mavros/fcu_url', '?')) @@ -487,7 +494,7 @@ def check_vpe(): failure('vision yaw weight is zero, change ATT_W_EXT_HDG parameter') else: info('vision yaw weight: %s', ff(vision_yaw_w)) - fuse = get_param('LPE_FUSION') + fuse = int(get_param('LPE_FUSION')) if not fuse & (1 << 2): failure('vision position fusion is disabled, change LPE_FUSION parameter') delay = get_param('LPE_VIS_DELAY') @@ -495,11 +502,22 @@ def check_vpe(): failure('LPE_VIS_DELAY = %s, but it should be zero', delay) info('LPE_VIS_XY = %s m, LPE_VIS_Z = %s m', get_paramf('LPE_VIS_XY'), get_paramf('LPE_VIS_Z')) elif est == 2: - fuse = get_param('EKF2_AID_MASK') - if not fuse & (1 << 3): - failure('vision position fusion is disabled, change EKF2_AID_MASK parameter') - if not fuse & (1 << 4): - failure('vision yaw fusion is disabled, change EKF2_AID_MASK parameter') + ev_ctrl = get_param('EKF2_EV_CTRL', strict=False) + if ev_ctrl is not None: # PX4 after v1.14 + ev_ctrl = int(ev_ctrl) + if not ev_ctrl & (1 << 0): + failure('vision horizontal position fusion is disabled, change EKF2_EV_CTRL parameter') + if not ev_ctrl & (1 << 1): + failure('vision vertical position fusion is disabled, change EKF2_EV_CTRL parameter') + if not ev_ctrl & (1 << 3): + failure('vision yaw fusion is disabled, change EKF2_EV_CTRL parameter') + else: # PX4 before v1.14 + fuse = int(get_param('EKF2_AID_MASK')) + if not fuse & (1 << 3): + failure('vision position fusion is disabled, change EKF2_AID_MASK parameter') + if not fuse & (1 << 4): + failure('vision yaw fusion is disabled, change EKF2_AID_MASK parameter') + delay = get_param('EKF2_EV_DELAY') if delay != 0: failure('EKF2_EV_DELAY = %.2f, but it should be zero', delay) @@ -606,8 +624,14 @@ def check_global_position(): rospy.wait_for_message('mavros/global_position/global', NavSatFix, timeout=0.8) except rospy.ROSException: info('no global position') - if get_param('SYS_MC_EST_GROUP') == 2 and (get_param('EKF2_AID_MASK', 0) & (1 << 0)): - failure('enabled GPS fusion may suppress vision position aiding') + if get_param('SYS_MC_EST_GROUP') == 2: + gps_ctrl = get_param('EKF2_GPS_CTRL', strict=False) + if gps_ctrl is not None: # PX4 after v1.14 + if int(gps_ctrl) & (1 << 0): + failure('GPS fusion enabled may suppress vision position aiding, change EKF2_GPS_CTRL') + else: # PX4 before v1.14 + if int(get_param('EKF2_AID_MASK', 0)) & (1 << 0): + failure('GPS fusion enabled may suppress vision position aiding, change EKF2_AID_MASK') @check('Optical flow') @@ -626,7 +650,7 @@ def check_optical_flow(): failure('SENS_FLOW_ROT = %s, but it should be zero', rot) est = get_param('SYS_MC_EST_GROUP') if est == 1: - fuse = get_param('LPE_FUSION') + fuse = int(get_param('LPE_FUSION')) if not fuse & (1 << 1): failure('optical flow fusion is disabled, change LPE_FUSION parameter') if not fuse & (1 << 1): @@ -640,9 +664,14 @@ def check_optical_flow(): get_paramf('LPE_FLW_R', 4), get_paramf('LPE_FLW_RR', 4)) elif est == 2: - fuse = get_param('EKF2_AID_MASK', 0) - if not fuse & (1 << 1): - failure('optical flow fusion is disabled, change EKF2_AID_MASK parameter') + of_ctrl = get_param('EKF2_OF_CTRL', strict=False) + if of_ctrl is not None: # PX4 after v1.14 + if of_ctrl == 0: + failure('optical flow fusion is disabled, change EKF2_OF_CTRL') + else: # PX4 before v1.14 + fuse = int(get_param('EKF2_AID_MASK', 0)) + if not fuse & (1 << 1): + failure('optical flow fusion is disabled, change EKF2_AID_MASK parameter') delay = get_param('EKF2_OF_DELAY', 0) if delay != 0: failure('EKF2_OF_DELAY = %.2f, but it should be zero', delay) @@ -684,23 +713,26 @@ def check_rangefinder(): est = get_param('SYS_MC_EST_GROUP') if est == 1: - fuse = get_param('LPE_FUSION', 0) + fuse = int(get_param('LPE_FUSION', 0)) if not fuse & (1 << 5): info('"pub agl as lpos down" in LPE_FUSION is disabled, NOT operating over flat surface') else: info('"pub agl as lpos down" in LPE_FUSION is enabled, operating over flat surface') elif est == 2: - hgt = get_param('EKF2_HGT_MODE') + hgt = get_param('EKF2_HGT_REF', strict=False) + if hgt is None: # PX4 before v1.14 + hgt = get_param('EKF2_HGT_MODE') if hgt != 2: info('EKF2_HGT_MODE != Range sensor, NOT operating over flat surface') else: info('EKF2_HGT_MODE = Range sensor, operating over flat surface') - aid = get_param('EKF2_RNG_AID') - if aid != 1: - info('EKF2_RNG_AID != 1, range sensor aiding disabled') - else: - info('EKF2_RNG_AID = 1, range sensor aiding enabled') + aid = get_param('EKF2_RNG_AID', strict=False) + if aid is not None: # PX4 before v1.14 + if aid != 1: + info('EKF2_RNG_AID != 1, range sensor aiding disabled') + else: + info('EKF2_RNG_AID = 1, range sensor aiding enabled') @check('Boot duration') diff --git a/clover/test/basic.test b/clover/test/basic.test index bd5366f00..a761f00a9 100755 --- a/clover/test/basic.test +++ b/clover/test/basic.test @@ -40,6 +40,16 @@ + + + + + + + + + + diff --git a/clover/udev/99-px4fmu.rules b/clover/udev/99-px4fmu.rules index 7e430b7d9..6fcef0984 100644 --- a/clover/udev/99-px4fmu.rules +++ b/clover/udev/99-px4fmu.rules @@ -1,17 +1,54 @@ -# PixHawk (px4fmu-v2), px4fmu-v3 +# Source files: PX4-Autopilot/boards/**/nuttx-config/nsh/defconfig + +# Additional info: +# https://docs.px4.io/main/en/flight_controller/ +# https://github.com/mavlink/qgroundcontrol/blob/master/src/comm/USBBoardInfo.json + +SUBSYSTEM=="tty", ATTRS{idVendor}=="26ac", ATTRS{idProduct}=="0001", ATTRS{product}=="PX4 GNF405", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="26ac", ATTRS{idProduct}=="0001", ATTRS{product}=="PX4 OmnibusF4SD", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="26ac", ATTRS{idProduct}=="0016", ATTRS{product}=="PX4 Crazyflie v2.0", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="1FC9", ATTRS{idProduct}=="001c", ATTRS{product}=="PX4 FMUK66 v3.x", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="1FC9", ATTRS{idProduct}=="001c", ATTRS{product}=="PX4 FMUK66 E", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="1FC9", ATTRS{idProduct}=="001d", ATTRS{product}=="PX4 FMURT1062 v1.x", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="26ac", ATTRS{idProduct}=="0001", ATTRS{product}=="DiatoneMambaF405 MK2", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="a32f", ATTRS{product}=="PX4 FMU ModalAI FCv1", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="a330", ATTRS{product}=="PX4 FMU ModalAI FCv2", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="26ac", ATTRS{idProduct}=="0012", ATTRS{product}=="PX4 FMU UVify Core", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="3162", ATTRS{idProduct}=="0050", ATTRS{product}=="PX4 KakuteH7", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="3162", ATTRS{idProduct}=="0050", ATTRS{product}=="PX4 KakuteH7v2", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="3162", ATTRS{idProduct}=="004b", ATTRS{product}=="PX4 DurandalV1", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="26ac", ATTRS{idProduct}=="0050", ATTRS{product}=="PX4 KakuteF7", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="3162", ATTRS{idProduct}=="0050", ATTRS{product}=="PX4 KakuteH7Mini-nand", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="3162", ATTRS{idProduct}=="004E", ATTRS{product}=="PX4 PIX32V5", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="26ac", ATTRS{idProduct}=="0061", ATTRS{product}=="PX4 ATL Mantis-EDU", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="3163", ATTRS{idProduct}=="004c", ATTRS{product}=="PX4 CUAV Nora", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="3163", ATTRS{idProduct}=="004c", ATTRS{product}=="PX4 CUAV X7Pro", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="1B8C", ATTRS{idProduct}=="0036", ATTRS{product}=="MatekH743-mini", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="1B8C", ATTRS{idProduct}=="0036", ATTRS{product}=="MatekH743", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="120A", ATTRS{idProduct}=="1004", ATTRS{product}=="Matekgnssm9nf4", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="1209", ATTRS{idProduct}=="1013", ATTRS{product}=="MatekH743", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="0037", ATTRS{product}=="PX4 FMU SmartAP AIRLink", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="2DAE", ATTRS{idProduct}=="1058", ATTRS{product}=="CubeOrange+", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="2DAE", ATTRS{idProduct}=="1012", ATTRS{product}=="CubeYellow", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="2DAE", ATTRS{idProduct}=="1016", ATTRS{product}=="CubeOrange", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="3185", ATTRS{idProduct}=="0035", ATTRS{product}=="PX4 FMU v6X.x", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="3185", ATTRS{idProduct}=="0038", ATTRS{product}=="PX4 FMU v6C.x", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="3185", ATTRS{idProduct}=="0033", ATTRS{product}=="PX4 FMU v5X.x", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="1B8C", ATTRS{idProduct}=="0036", ATTRS{product}=="PX4 FMU v6U.x", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="26ac", ATTRS{idProduct}=="0013", ATTRS{product}=="PX4 FMU v4.x PRO", SYMLINK+="px4fmu" SUBSYSTEM=="tty", ATTRS{idVendor}=="26ac", ATTRS{idProduct}=="0011", ATTRS{product}=="PX4 FMU v2.x", SYMLINK+="px4fmu" -# PixRacer (px4fmu-v4) SUBSYSTEM=="tty", ATTRS{idVendor}=="26ac", ATTRS{idProduct}=="0012", ATTRS{product}=="PX4 FMU v4.x", SYMLINK+="px4fmu" -# px4fmu-v5 SUBSYSTEM=="tty", ATTRS{idVendor}=="26ac", ATTRS{idProduct}=="0032", ATTRS{product}=="PX4 FMU v5.x", SYMLINK+="px4fmu" -# auav -SUBSYSTEM=="tty", ATTRS{idVendor}=="26ac", ATTRS{idProduct}=="0021", ATTRS{product}=="PX4 AUAV x2.1", SYMLINK+="px4fmu" -# crazyflie -SUBSYSTEM=="tty", ATTRS{idVendor}=="26ac", ATTRS{idProduct}=="0016", ATTRS{product}=="PX4 Crazyflie v2.0", SYMLINK+="px4fmu" -# px4fmu-v4pro -SUBSYSTEM=="tty", ATTRS{idVendor}=="26ac", ATTRS{idProduct}=="0013", ATTRS{product}=="PX4 FMU v4.x PRO", SYMLINK+="px4fmu" -# Omnibus -SUBSYSTEM=="tty", ATTRS{idVendor}=="26ac", ATTRS{idProduct}=="0001", ATTRS{product}=="PX4 OmnibusF4SD", SYMLINK+="px4fmu" -# CUAV X7 Pro -SUBSYSTEM=="tty", ATTRS{idVendor}=="3163", ATTRS{idProduct}=="004c", ATTRS{product}=="PX4 CUAV X7Pro", SYMLINK+="px4fmu" - +SUBSYSTEM=="tty", ATTRS{idVendor}=="3162", ATTRS{idProduct}=="004b", ATTRS{product}=="PX4 SP RACING H7 EXTREME", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="26ac", ATTRS{idProduct}=="0030", ATTRS{product}=="MindPX FMU v2.x", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="3185", ATTRS{idProduct}=="0039", ATTRS{product}=="ARK FMU v6X.x", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="26ac", ATTRS{idProduct}=="0016", ATTRS{product}=="PX4 FreeFly RTK GPS", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="26ac", ATTRS{idProduct}=="1024", ATTRS{product}=="mRoControlZeroH7 OEM", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="26ac", ATTRS{idProduct}=="1017", ATTRS{product}=="mRoPixracerPro", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="26ac", ATTRS{idProduct}=="1023", ATTRS{product}=="mRoControlZeroH7", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="26ac", ATTRS{idProduct}=="008D", ATTRS{product}=="mRoControlZeroF7", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="26ac", ATTRS{idProduct}=="0021", ATTRS{product}=="PX4 AUAV X2.1", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="26ac", ATTRS{idProduct}=="1022", ATTRS{product}=="mRoControlZero Classic", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="26ac", ATTRS{idProduct}=="0088", ATTRS{product}=="mRo x2.1-777", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="35a7", ATTRS{idProduct}=="0002", ATTRS{product}=="FCC-R1", SYMLINK+="px4fmu" +SUBSYSTEM=="tty", ATTRS{idVendor}=="35a7", ATTRS{idProduct}=="0001", ATTRS{product}=="FCC-K1", SYMLINK+="px4fmu" diff --git a/docs/assets/stl/grip_left.stl b/docs/assets/stl/grip_left.stl new file mode 100644 index 000000000..a8a65687c Binary files /dev/null and b/docs/assets/stl/grip_left.stl differ diff --git a/docs/assets/stl/grip_right.stl b/docs/assets/stl/grip_right.stl new file mode 100644 index 000000000..5f802c0b6 Binary files /dev/null and b/docs/assets/stl/grip_right.stl differ diff --git a/docs/en/models.md b/docs/en/models.md index 3d6f96917..17f2bec49 100644 --- a/docs/en/models.md +++ b/docs/en/models.md @@ -198,6 +198,15 @@ This page contains models and drawings of some of the drone parts. They can be u +### 3D print + +#### Mechanical gripper + +* **Left claw**: [`grip_left.stl`](https://github.com/CopterExpress/clover/raw/master/docs/assets/stl/grip_left.stl). +* **Right claw**: [`grip_right.stl`](https://github.com/CopterExpress/clover/raw/master/docs/assets/stl/grip_right.stl). + +Material: SBS Glass. Infill: 100%. Quantity: 1 pcs. + ## Clover 4 ### 3D print diff --git a/docs/en/parameters.md b/docs/en/parameters.md index fc0c2a473..0895a8ee4 100644 --- a/docs/en/parameters.md +++ b/docs/en/parameters.md @@ -39,17 +39,27 @@ In case of using EKF2 (official firmware): |Parameter|Value|Comment| |-|-|-| -|`EKF2_AID_MASK`|26|Checkboxes: *flow* + *vision position* + *vision yaw*.
Details: [Optical Flow](optical_flow.md), [ArUco markers](aruco_map.md), [GPS](gps.md).| +|`EKF2_AID_MASK`\*|26|Checkboxes: *flow* + *vision position* + *vision yaw*.
Details: [Optical Flow](optical_flow.md), [ArUco markers](aruco_map.md), [GPS](gps.md).| |`EKF2_OF_DELAY`|0|| |`EKF2_OF_QMIN`|10|| |`EKF2_OF_N_MIN`|0.05|| |`EKF2_OF_N_MAX`|0.2|| -|`EKF2_HGT_MODE`|3 (*Vision*)|If the [rangefinder](laser.md) is present and flying over horizontal floor – 2 (*Range sensor*)| +|`EKF2_HGT_MODE`\*|3 (*Vision*)|If the [rangefinder](laser.md) is present and flying over horizontal floor – 2 (*Range sensor*)| |`EKF2_EVA_NOISE`|0.1|| |`EKF2_EVP_NOISE`|0.1|| |`EKF2_EV_DELAY`|0|| |`EKF2_MAG_TYPE`|5 (*None*)|Disabling usage of the magnetometer (when navigating indoor)| +\* — starting from PX4 version 1.14, the parameters marked with an asterisk are replaced with the following: + +|Parameter|Value|Comment| +|-|-|-| +|`EKF2_EV_CTRL`|11|Checkboxes: *Horizontal position* + *Vertical position* + *Yaw*| +|`EKF2_GPS_CTRL`|0|All checkboxes are disabled| +|`EKF2_BARO_CTRL`|0 (*Disabled*)|Barometer is disabled| +|`EKF2_OF_CTRL`|1 (*Enabled*)|Optical flow is enabled| +|`EKF2_HGT_REF`|3 (*Vision*)|If the [rangefinder](laser.md) is present and flying over horizontal floor – 2 (*Range sensor*)| + > **Info** See also: list of default parameters of the [Clover simulator](simulation.md): https://github.com/CopterExpress/clover/blob/master/clover_simulation/airframes/4500_clover. diff --git a/docs/ru/camera_setup.md b/docs/ru/camera_setup.md index 83c87d138..cc987752d 100644 --- a/docs/ru/camera_setup.md +++ b/docs/ru/camera_setup.md @@ -66,7 +66,7 @@ #### Камера направлена вверх, шлейф вперёд ```xml - + ``` diff --git a/docs/ru/models.md b/docs/ru/models.md index 6a925c71d..2428edce4 100644 --- a/docs/ru/models.md +++ b/docs/ru/models.md @@ -200,13 +200,20 @@ ### 3D печать +#### Механический захват + +* **Левая клешня**: [`grip_left.stl`](https://github.com/CopterExpress/clover/raw/master/docs/assets/stl/grip_left.stl). +* **Правая клешня**: [`grip_right.stl`](https://github.com/CopterExpress/clover/raw/master/docs/assets/stl/grip_right.stl). + +Материал: SBS Glass. Заполнение 100%. Количество: 1 шт. + #### Груз для магнитного захвата -* Груз для магнитного захвата: [`load_for_magnetic_grip.stl`](https://github.com/CopterExpress/clover/raw/master/docs/assets/grip_load/load_for_magnetic_grip.stl) -* Дополнение-для-подставки-груза: [`add-on_for_load_support.stl`](https://github.com/CopterExpress/clover/raw/master/docs/assets/grip_load/add-on_for_load_support.stl) -* Подставка под теннисный мяч для магнитного захвата: [`tennis_ball_stand_for_magnetic_grip.stl`](https://github.com/CopterExpress/clover/raw/master/docs/assets/grip_load/tennis_ball_stand_for_magnetic_grip.stl). +* **Груз для магнитного захвата**: [`load_for_magnetic_grip.stl`](https://github.com/CopterExpress/clover/raw/master/docs/assets/grip_load/load_for_magnetic_grip.stl). +* **Дополнение для подставки груза**: [`add-on_for_load_support.stl`](https://github.com/CopterExpress/clover/raw/master/docs/assets/grip_load/add-on_for_load_support.stl). +* **Подставка под теннисный мяч для магнитного захвата**: [`tennis_ball_stand_for_magnetic_grip.stl`](https://github.com/CopterExpress/clover/raw/master/docs/assets/grip_load/tennis_ball_stand_for_magnetic_grip.stl). -Материал: PETG. Заполнение 100%. Количество: 1шт. +Материал: PETG. Заполнение 100%. Количество: 1 шт. ## Клевер 4 diff --git a/docs/ru/parameters.md b/docs/ru/parameters.md index 4af735247..1b53a4a73 100644 --- a/docs/ru/parameters.md +++ b/docs/ru/parameters.md @@ -39,17 +39,27 @@ |Параметр|Значение|Примечание| |-|-|-| -|`EKF2_AID_MASK`|26|Чекбоксы: *flow* + *vision position* + *vision yaw*.
Подробнее: [Optical Flow](optical_flow.md), [ArUco-маркеры](aruco_map.md), [GPS](gps.md).| +|`EKF2_AID_MASK`\*|26|Чекбоксы: *flow* + *vision position* + *vision yaw*.
Подробнее: [Optical Flow](optical_flow.md), [ArUco-маркеры](aruco_map.md), [GPS](gps.md).| |`EKF2_OF_DELAY`|0|| |`EKF2_OF_QMIN`|10|| |`EKF2_OF_N_MIN`|0.05|| |`EKF2_OF_N_MAX`|0.2|| -|`EKF2_HGT_MODE`|3 (*Vision*)|При наличии [дальномера](laser.md) и полете над ровным полом — 2 (*Range sensor*)| +|`EKF2_HGT_MODE`\*|3 (*Vision*)|При наличии [дальномера](laser.md) и полете над ровным полом — 2 (*Range sensor*)| |`EKF2_EVA_NOISE`|0.1|| |`EKF2_EVP_NOISE`|0.1|| |`EKF2_EV_DELAY`|0|| |`EKF2_MAG_TYPE`|5 (*None*)|Выключение магнитометра (при навигации внутри помещения)| +\* — начиная с версии PX4 1.14 помеченные звездочкой параметры заменены на следующие: + +|Параметр|Значение|Примечание| +|-|-|-| +|`EKF2_EV_CTRL`|11|Чекбоксы: *Horizontal position* + *Vertical position* + *Yaw*| +|`EKF2_GPS_CTRL`|0|Все чекбоксы сняты| +|`EKF2_BARO_CTRL`|0 (*Disabled*)|Барометр отключен| +|`EKF2_OF_CTRL`|1 (*Enabled*)|Optical flow включен| +|`EKF2_HGT_REF`|3 (*Vision*)|При наличии [дальномера](laser.md) и полете над ровным полом — 2 (*Range sensor*)| + > **Info** См. также: список параметров по умолчанию в [симуляторе](simulation.md): https://github.com/CopterExpress/clover/blob/master/clover_simulation/airframes/4500_clover. diff --git a/docs/ru/testing.md b/docs/ru/testing.md index 201874c25..2a8275e9b 100644 --- a/docs/ru/testing.md +++ b/docs/ru/testing.md @@ -23,6 +23,7 @@ * **Корректная работа optical flow и всех его топиков, полет по optical flow** * **Полет по полю маркеров** * **Корректная установка OpenCV – возможность использования из Python и C++** +* Работа примера с компьютерном зрением: `red_circle.py` * **Отсутствие неожиданного жора памяти и CPU (можно контролировать с помощью `selfcheck.py` или `htop`)** * Автоматическая перекалибровка камеры при изменении разрешения @@ -60,7 +61,7 @@ * **В фрейме `aruco_map`** * **В фрейме `map`** * **В фрейме `navigate_target`** -* **В фрейме `terrain`**. +* **В фрейме `terrain`** * Корректное выполнения флипа * **Возможность лететь к отдельным маркерам в карте, которые вне кадра и в кадре** * **Корректное детектирование статуса kill switch при выполнение команды с флагом `auto_arm`** @@ -103,6 +104,7 @@ * ROS ноды не падают в случае потери всех соединений (удобно проверять с экраном) * Работает `rosshow` * Работает `espeak` +* Работает аргумент `rectify` в `main_camera.launch` * *Работает LIRC* * *Работа iOS-пульта из коробки* * *Работа Android-пульта из коробки*