Skip to content

Commit 904f2ce

Browse files
Ryanf55peterbarker
authored andcommitted
mavproxy_fence: Support MAV_CMD_NAV_FENCE_HOME_CIRCLE_INCLUSION
Signed-off-by: Ryan Friedman <25047695+Ryanf55@users.noreply.github.com>
1 parent 6f7b485 commit 904f2ce

2 files changed

Lines changed: 68 additions & 10 deletions

File tree

MAVProxy/modules/mavproxy_fence.py

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
from MAVProxy.modules.lib.mp_menu import MPMenuCallTextDialog
1818
from MAVProxy.modules.lib.mp_menu import MPMenuItem
1919

20+
DEFAULT_CIRCLE_SIZE = 500
21+
2022

2123
class FenceModule(mission_item_protocol.MissionItemProtocolModule):
2224
'''uses common MISSION_ITEM protocol base class to provide fence
@@ -36,14 +38,14 @@ def gui_menu_items(self):
3638
'Add Inclusion Circle', 'Add Inclusion Circle', '# fence addcircle inc ',
3739
handler=MPMenuCallTextDialog(
3840
title='Radius (m)',
39-
default=500
41+
default=DEFAULT_CIRCLE_SIZE
4042
)
4143
),
4244
MPMenuItem(
4345
'Add Exclusion Circle', 'Add Exclusion Circle', '# fence addcircle exc ',
4446
handler=MPMenuCallTextDialog(
4547
title='Radius (m)',
46-
default=500
48+
default=DEFAULT_CIRCLE_SIZE
4749
)
4850
),
4951
MPMenuItem(
@@ -55,6 +57,13 @@ def gui_menu_items(self):
5557
MPMenuItem(
5658
'Add Return Point', 'Add Return Point', '# fence addreturnpoint',
5759
),
60+
MPMenuItem(
61+
'Add Home Centered Inclusion Circle', 'Add Home Inclusion Circle', '# fence addhomecircle ',
62+
handler=MPMenuCallTextDialog(
63+
title='Radius (m)',
64+
default=DEFAULT_CIRCLE_SIZE
65+
)
66+
),
5867
])
5968
return ret
6069

@@ -82,12 +91,17 @@ def circles_of_type(self, t):
8291
if p.command != t:
8392
continue
8493
ret.append(p)
94+
8595
return ret
8696

8797
def inclusion_circles(self):
8898
'''return a list of Circle inclusion fences - a single MISSION_ITEM each'''
8999
return self.circles_of_type(mavutil.mavlink.MAV_CMD_NAV_FENCE_CIRCLE_INCLUSION)
90100

101+
def home_inclusion_circles(self):
102+
'''return a list of around-home Circle inclusion fences - a single MISSION_ITEM each'''
103+
return self.circles_of_type(mavutil.mavlink.MAV_CMD_NAV_FENCE_HOME_CIRCLE_INCLUSION)
104+
91105
def exclusion_circles(self):
92106
'''return a list of Circle exclusion fences - a single MISSION_ITEM each'''
93107
return self.circles_of_type(mavutil.mavlink.MAV_CMD_NAV_FENCE_CIRCLE_EXCLUSION)
@@ -341,6 +355,35 @@ def cmd_addcircle(self, args):
341355
self.append(m)
342356
self.send_all_items()
343357

358+
def cmd_addhomecircle(self, args):
359+
'''adds a home-centered circle to the map with given radius'''
360+
if not self.check_have_list():
361+
return
362+
if len(args) < 1:
363+
print("Usage: fence addhomecircle RADIUS")
364+
return
365+
radius = float(args[0])
366+
367+
m = mavutil.mavlink.MAVLink_mission_item_int_message(
368+
self.target_system,
369+
self.target_component,
370+
0, # seq
371+
mavutil.mavlink.MAV_FRAME_GLOBAL, # frame
372+
mavutil.mavlink.MAV_CMD_NAV_FENCE_HOME_CIRCLE_INCLUSION, # command
373+
0, # current
374+
0, # autocontinue
375+
radius, # param1,
376+
0.0, # param2,
377+
0.0, # param3
378+
0.0, # param4
379+
0, # x (latitude), ignored
380+
0, # y (longitude), ignored
381+
0, # z (altitude)
382+
self.mav_mission_type(),
383+
)
384+
self.append(m)
385+
self.send_all_items()
386+
344387
def cmd_addreturnpoint(self, args):
345388
'''adds a returnpoint at the map click location'''
346389
if not self.check_have_list():
@@ -569,6 +612,7 @@ def is_circle_item(self, item):
569612
return item.command in [
570613
mavutil.mavlink.MAV_CMD_NAV_FENCE_CIRCLE_EXCLUSION,
571614
mavutil.mavlink.MAV_CMD_NAV_FENCE_CIRCLE_INCLUSION,
615+
mavutil.mavlink.MAV_CMD_NAV_FENCE_HOME_CIRCLE_INCLUSION,
572616
]
573617

574618
def find_polygon_point(self, polygon_start_seq, item_offset):
@@ -784,6 +828,7 @@ def commands(self):
784828
ret = super(FenceModule, self).commands()
785829
ret.update({
786830
'addcircle': (self.cmd_addcircle, ["<inclusion|inc|exclusion|exc>", "RADIUS"]),
831+
'addhomecircle': (self.cmd_addhomecircle, ["RADIUS"]),
787832
'movecircle': (self.cmd_movecircle, []),
788833
'setcircleradius': (self.cmd_setcircleradius, ["seq radius"]),
789834
'addpoly': (self.cmd_addpoly, ["<inclusion|inc|exclusion|exc>", "<radius>" "<pointcount>", "<rotation>"]),

MAVProxy/modules/mavproxy_map/__init__.py

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ def __init__(self, mpstate):
7373
('contour_grid_spacing', float, 30.0),
7474
('contour_grid_extent', float, 20000.0),
7575
])
76+
self.home_pos = ()
77+
self.last_rendered_home_pos = ()
7678

7779
service = 'MicrosoftHyb'
7880
if 'MAP_SERVICE' in os.environ:
@@ -552,11 +554,14 @@ def polyfence_move_polygon_point(self, id, extra):
552554
def display_polyfences_circles(self, circles, colour):
553555
'''draws circles in the PolyFence layer with colour colour'''
554556
for circle in circles:
555-
lat = circle.x
556-
lng = circle.y
557-
if circle.get_type() == 'MISSION_ITEM_INT':
558-
lat *= 1e-7
559-
lng *= 1e-7
557+
if circle.command == mavutil.mavlink.MAV_CMD_NAV_FENCE_HOME_CIRCLE_INCLUSION:
558+
(lat, lng) = self.home_pos
559+
else:
560+
lat = circle.x
561+
lng = circle.y
562+
if circle.get_type() == 'MISSION_ITEM_INT':
563+
lat *= 1e-7
564+
lng *= 1e-7
560565
items = [
561566
MPMenuItem('Remove Circle', returnkey='popupPolyFenceRemoveCircle'),
562567
MPMenuItem('Move Circle', returnkey='popupPolyFenceMoveCircle'),
@@ -578,6 +583,11 @@ def display_polyfences_inclusion_circles(self):
578583
inclusions = self.module('fence').inclusion_circles()
579584
self.display_polyfences_circles(inclusions, (0, 255, 0))
580585

586+
def display_polyfences_home_inclusion_circles(self):
587+
'''draws around-inclusion circles in the PolyFence layer'''
588+
inclusions = self.module('fence').home_inclusion_circles()
589+
self.display_polyfences_circles(inclusions, (0, 255, 96))
590+
581591
def display_polyfences_exclusion_circles(self):
582592
'''draws exclusion circles in the PolyFence layer with colour colour'''
583593
exclusions = self.module('fence').exclusion_circles()
@@ -652,6 +662,7 @@ def display_polyfences(self):
652662
'''draws PolyFence items in the PolyFence layer'''
653663
self.map.add_object(mp_slipmap.SlipClearLayer('PolyFence'))
654664
self.display_polyfences_inclusion_circles()
665+
self.display_polyfences_home_inclusion_circles()
655666
self.display_polyfences_exclusion_circles()
656667
self.display_polyfences_inclusion_polygons()
657668
self.display_polyfences_exclusion_polygons()
@@ -1251,11 +1262,11 @@ def mavlink_packet(self, m):
12511262
self.map.set_follow_object('Pos' + vehicle, self.message_is_from_primary_vehicle(m))
12521263

12531264
elif mtype == 'HOME_POSITION':
1254-
(lat, lon) = (m.latitude*1.0e-7, m.longitude*1.0e-7)
1265+
self.home_pos = (m.latitude*1.0e-7, m.longitude*1.0e-7)
12551266
icon = self.map.icon('home.png')
12561267
self.map.add_object(mp_slipmap.SlipIcon(
12571268
'HOME_POSITION',
1258-
(lat, lon),
1269+
self.home_pos,
12591270
icon,
12601271
layer=3,
12611272
rotation=0,
@@ -1337,8 +1348,10 @@ def check_redisplay_fencepoints(self):
13371348
else:
13381349
# old fence module
13391350
last_change = fence_module.fenceloader.last_change
1340-
if self.fence_change_time != last_change:
1351+
if (self.fence_change_time != last_change or
1352+
self.home_pos != self.last_rendered_home_pos):
13411353
self.fence_change_time = last_change
1354+
self.last_rendered_home_pos = self.home_pos
13421355
self.display_fence()
13431356

13441357
def check_redisplay_rallypoints(self):

0 commit comments

Comments
 (0)