2012-04-07 17 views
5

Tôi đang cố lập trình một robot để di chuyển. Robot di chuyển dựa trên vị trí hiện tại. Có bốn nơi có thể là:Chuyển động Robot bằng Python

LOCATION1 Motion Plan is like so, 
5 6 
3 4 
1 2 
Initial positon is (x1,y1) 
This gets coded as (x1,y1)->(x1+dx,y1)->(x1,y1+dy)->(x1+dx,y1+dy) ... and so on 

LOCATION2 Motion Plan is like so, 
5 3 1 
6 4 2 
The initial position is (x1,y1) 
This gets coded as (x1,y1)->(x1,y1-dy)->(x1-dx,y1)->(x1-dx,y1-dy) ... and so on 

LOCATION3 Motion Plan is like so, 
6 5 
4 3 
2 1 
Initial positon is (x1,y1) 
This gets coded as (x1,y1)->(x1-dx,y1)->(x1,y1+dy)->(x1-dx,y1+dy) ... and so on 

LOCATION4 Motion Plan is like so, 
6 4 2 
5 3 1 
The initial position is (x1,y1) 
This gets coded as (x1,y1)->(x1,y1+dy)->(x1-dx,y1)->(x1-dx,y1+dy) ... and so on 

Tôi đang cố gắng tìm ra cách tốt để mã hóa điều này. Tôi đang suy nghĩ về dòng xác định 4 nguyên tắc di chuyển tiếp theo khác nhau và sau đó có một loạt các câu lệnh if mà chọn các quy tắc đúng

Có ai đó làm điều gì đó tương tự ... Có cách nào tốt hơn

+0

Sử dụng mẫu thiết kế máy trạng thái – pylover

Trả lời

2

Tôi biết rằng điều này có thể được thực hiện thanh lịch hơn (và tên cho các phương pháp của tôi là khủng khiếp!), Nhưng có thể một cái gì đó như thế này?

>>> import itertools 
>>> def alternator(*values): 
...  return itertools.cycle(values) 
... 
>>> def increasor(value_1, dvalue_1, steps=2): 
...  counter = itertools.count(value_1, dvalue_1) 
...  while True: 
...    repeater = itertools.repeat(counter.next(), steps) 
...    for item in repeater: 
...     yield item 
... 
>>> def motion_plan(x_plan, y_plan, steps=6): 
...  while steps > 0: 
...   yield (x_plan.next(), y_plan.next()) 
...   steps -= 1 
... 
>>> for pos in motion_plan(alternator('x1', 'x1+dx'), increaser('y1', '+dy'): #Location 1 motion plan 
...  print pos 
... 
('x1', 'y1') 
('x1+dx', 'y1') 
('x1', 'y1+dy') 
('x1+dx', 'y1+dy') 
('x1', 'y1+dy+dy') 
('x1+dx', 'y1+dy+dy') 

Tôi không chắc chắn bạn cần bao nhiêu sự linh hoạt với điều này, bạn có thể giảm độ phức tạp hơn nữa nếu bạn muốn loại bỏ sự linh hoạt. Ngoài ra bạn gần như chắc chắn sẽ không sử dụng dây cho điều này, tôi chỉ nghĩ rằng đó là cách dễ nhất để chứng minh ý tưởng. Nếu bạn sử dụng con số, sau đó một cái gì đó như thế này:

>>> count = 0 
>>> for pos in motion_plan(increaser(0, -1), alternator(0, 1)): #location 4 motion plan 
...  print "%d %r" % (count, pos) 
...  count += 1 
1 (0, 0) 
2 (0, 1) 
3 (-1, 0) 
4 (-1, 1) 
5 (-2, 0) 
6 (-2, 1) 

nên tương ứng khá rõ ràng như thế này:

LOCATION4 Motion Plan is like so, 
6 4 2 
5 3 1 

Tôi tin rằng các kế hoạch chuyển động sẽ như sau:

Location1 = motion_plan(alternator(0, 1), increasor(0, 1)) 
Location2 = motion_plan(increasor(0, -1), alternator(0, -1)) 
Location3 = motion_plan(alternator(0, -1), increasor(0, 1)) 
Location4 = motion_plan(increasor(0, -1), alternator(0, 1)) 
0

Bạn có thể làm rằng, những gì bạn sẽ làm là.

def motion_loc1(x1,y1,dx,dy): 
    # your operation 


def motion_loc2(x1,y1,dx,dy): 
    # your operation 

Và sau đó trong chương trình chính, tùy thuộc vào x1, y1 gọi các phương thức chuyển động khác nhau.

Các vấn đề liên quan