admin管理员组文章数量:1025251
I am currently working on my bachelor's thesis. As hardware programming is not the main focus of my studies, I might be missing a critical point, and I'm seeking the community's expertise to help resolve this issue.
I am using an AR.Drone2.0 and have written the following code to control its movements. However, despite issuing various movement commands, the drone does not exhibit any definitive movement. I suspect there might be an issue with the commands being sent or the timing between the main thread and the command thread.
I have tried taking off and landing, and these commands usually work. However, sometimes the script skips the landing command and exits without the drone actually landing, which is odd but not the main problem.
The drone tends to hover when I send the move command with the hover flag set to false. I expected the drone to be much more stable, but it moves around quite a lot.
The actual problem comes when I send a move command. In this case, the drone sometimes moves, but the movement seems undetermined and imprecise. For every unit of movement in the intended direction, it displays one unit of movement in two false directions, which I don't understand and haven't been able to solve on my own so far.
Your support is greatly appreciated.
Here is the relevant code:
class Drone:
def __init__(self, ip: str, ports: dict) -> None:
self.ip = ip # IP address of the drone
self_port = ports['com-port']
self.nav_port = ports['nav-port']
self.crit_port = ports['crit-port']
# Setting up sockets
self_socket = self.setup_socket() #socket to send command
self.nav_socket = self.setup_socket() #socket to receive navdata
# Set up NavData listening in a separate thread
self.nav_queue = queue.Queue()
self.navdata_thread = threading.Thread(target=self.receive_navdata)
self.navdata_thread.daemon = True # Allow thread to exit when main program exits
# Set up NavData processing in a separate thread
self.decoded_nav_queue = queue.Queue()
self.decode_navdata_thread = threading.Thread(target=self.decode_navdata)
self.decode_navdata_thread.daemon = True # Allow thread to exit when main program exits
self.navdata_log: pd.DataFrame = pd.DataFrame()
# Set up Commands in a separate thread
selfmand_queue = queue.Queue()
selfmand_counter = 1
selfmand_thread = threading.Thread(target=self.send_command)
selfmand_thread.daemon = True # Allow thread to exit when main program exits
#start the threads
self.decode_navdata_thread.start()
self.navdata_thread.start()
selfmand_thread.start()
def send_command(self):
"""Send control commands to the drone."""
while True:
if not selfmand_queue.empty():
command = selfmand_queue.get()
command = command.replace('#COMID#', str(selfmand_counter))
selfmand_counter += 1
else:
command = 'AT*COMWDG\r'
self_socket.sendto(command.encode(), (self.ip, self_port))
print()
print()
print(f"Sent control command: {command}")
print()
print()
time.sleep(0.03)
# Takeoff and landing is described in the documentation of the drone page 35.
#
def takeoff(self) -> None:
order = str(int('00010001010101000000001000000000',2))
command = f'AT*REF=#COMID#,{order}\r'
selfmand_queue.put(command)
def land(self) -> None:
order = str(int('00010001010101000000000000000000',2))
command = f'AT*REF=#COMID#,{order}\r'
selfmand_queue.put(command)
def move(self, hover: bool, lr_tilt: float, fb_tilt: float, vert_speed: float, yaw_speed: float) -> None:
"""
Controls the drone's movement by adjusting its tilt and speed.
Parameters:
hover (bool): A flag indicating whether the drone should hover in place.
If True, the drone will maintain its current position and
orientation without any lateral, longitudinal, or vertical
movement. This is useful for stabilizing the drone in air.
If False, the drone will move according to the provided
tilt and speed parameters.
lr_tilt (float): The lateral or left-right tilt of the drone.
Positive values tilt the drone to the right,
while negative values tilt it to the left.
Range: -1.0 to 1.0.
fb_tilt (float): The longitudinal or forward-backward tilt of the drone.
Positive values tilt the drone forward, facilitating
forward movement, whereas negative values tilt it backward.
Range: -1.0 to 1.0.
vert_speed (float): The vertical speed of the drone, dictating its
ascent or descent. Positive values increase the
altitude, while negative values decrease it.
Range: -1.0 to 1.0.
yaw_speed (float): The rotational speed of the drone around its vertical
axis. Positive values rotate the drone clockwise, and
negative values rotate it counterclockwise.
Range: -1.0 to 1.0.
"""
if hover == True:
flag = 0
else:
flag = 1
lr_tilt = int(lr_tilt * 1000.0)
fb_tilt = int(fb_tilt * 1000.0)
vert_speed = int(vert_speed * 1000.0)
yaw_speed = int(yaw_speed * 1000.0)
command = f'AT*PCMD=#COMID#,{flag},{lr_tilt},{fb_tilt},{vert_speed},{yaw_speed}\r'
selfmand_queue.put(command)
if __name__ == "__main__":
ports = {'com-port': 5556, 'nav-port': 5554, 'crit-port': 5559}
drone_ = Drone(ip="192.168.1.1", ports=ports)
# Send the command to start NavData stream
Drone.start_navdata_stream(self= drone_)
#Example: Send a takeoff and land command
drone_.takeoff()
time.sleep(6)
for _ in range(100):
drone_.move(True, 0.0, 0.0, 0.0, 0.0)
for _ in range(100):
drone_.move(False, 0.0, -1.0, 0.0, 0.0)
time.sleep(6)
drone_.land()
time.sleep(3)
I am currently working on my bachelor's thesis. As hardware programming is not the main focus of my studies, I might be missing a critical point, and I'm seeking the community's expertise to help resolve this issue.
I am using an AR.Drone2.0 and have written the following code to control its movements. However, despite issuing various movement commands, the drone does not exhibit any definitive movement. I suspect there might be an issue with the commands being sent or the timing between the main thread and the command thread.
I have tried taking off and landing, and these commands usually work. However, sometimes the script skips the landing command and exits without the drone actually landing, which is odd but not the main problem.
The drone tends to hover when I send the move command with the hover flag set to false. I expected the drone to be much more stable, but it moves around quite a lot.
The actual problem comes when I send a move command. In this case, the drone sometimes moves, but the movement seems undetermined and imprecise. For every unit of movement in the intended direction, it displays one unit of movement in two false directions, which I don't understand and haven't been able to solve on my own so far.
Your support is greatly appreciated.
Here is the relevant code:
class Drone:
def __init__(self, ip: str, ports: dict) -> None:
self.ip = ip # IP address of the drone
self_port = ports['com-port']
self.nav_port = ports['nav-port']
self.crit_port = ports['crit-port']
# Setting up sockets
self_socket = self.setup_socket() #socket to send command
self.nav_socket = self.setup_socket() #socket to receive navdata
# Set up NavData listening in a separate thread
self.nav_queue = queue.Queue()
self.navdata_thread = threading.Thread(target=self.receive_navdata)
self.navdata_thread.daemon = True # Allow thread to exit when main program exits
# Set up NavData processing in a separate thread
self.decoded_nav_queue = queue.Queue()
self.decode_navdata_thread = threading.Thread(target=self.decode_navdata)
self.decode_navdata_thread.daemon = True # Allow thread to exit when main program exits
self.navdata_log: pd.DataFrame = pd.DataFrame()
# Set up Commands in a separate thread
selfmand_queue = queue.Queue()
selfmand_counter = 1
selfmand_thread = threading.Thread(target=self.send_command)
selfmand_thread.daemon = True # Allow thread to exit when main program exits
#start the threads
self.decode_navdata_thread.start()
self.navdata_thread.start()
selfmand_thread.start()
def send_command(self):
"""Send control commands to the drone."""
while True:
if not selfmand_queue.empty():
command = selfmand_queue.get()
command = command.replace('#COMID#', str(selfmand_counter))
selfmand_counter += 1
else:
command = 'AT*COMWDG\r'
self_socket.sendto(command.encode(), (self.ip, self_port))
print()
print()
print(f"Sent control command: {command}")
print()
print()
time.sleep(0.03)
# Takeoff and landing is described in the documentation of the drone page 35.
#
def takeoff(self) -> None:
order = str(int('00010001010101000000001000000000',2))
command = f'AT*REF=#COMID#,{order}\r'
selfmand_queue.put(command)
def land(self) -> None:
order = str(int('00010001010101000000000000000000',2))
command = f'AT*REF=#COMID#,{order}\r'
selfmand_queue.put(command)
def move(self, hover: bool, lr_tilt: float, fb_tilt: float, vert_speed: float, yaw_speed: float) -> None:
"""
Controls the drone's movement by adjusting its tilt and speed.
Parameters:
hover (bool): A flag indicating whether the drone should hover in place.
If True, the drone will maintain its current position and
orientation without any lateral, longitudinal, or vertical
movement. This is useful for stabilizing the drone in air.
If False, the drone will move according to the provided
tilt and speed parameters.
lr_tilt (float): The lateral or left-right tilt of the drone.
Positive values tilt the drone to the right,
while negative values tilt it to the left.
Range: -1.0 to 1.0.
fb_tilt (float): The longitudinal or forward-backward tilt of the drone.
Positive values tilt the drone forward, facilitating
forward movement, whereas negative values tilt it backward.
Range: -1.0 to 1.0.
vert_speed (float): The vertical speed of the drone, dictating its
ascent or descent. Positive values increase the
altitude, while negative values decrease it.
Range: -1.0 to 1.0.
yaw_speed (float): The rotational speed of the drone around its vertical
axis. Positive values rotate the drone clockwise, and
negative values rotate it counterclockwise.
Range: -1.0 to 1.0.
"""
if hover == True:
flag = 0
else:
flag = 1
lr_tilt = int(lr_tilt * 1000.0)
fb_tilt = int(fb_tilt * 1000.0)
vert_speed = int(vert_speed * 1000.0)
yaw_speed = int(yaw_speed * 1000.0)
command = f'AT*PCMD=#COMID#,{flag},{lr_tilt},{fb_tilt},{vert_speed},{yaw_speed}\r'
selfmand_queue.put(command)
if __name__ == "__main__":
ports = {'com-port': 5556, 'nav-port': 5554, 'crit-port': 5559}
drone_ = Drone(ip="192.168.1.1", ports=ports)
# Send the command to start NavData stream
Drone.start_navdata_stream(self= drone_)
#Example: Send a takeoff and land command
drone_.takeoff()
time.sleep(6)
for _ in range(100):
drone_.move(True, 0.0, 0.0, 0.0, 0.0)
for _ in range(100):
drone_.move(False, 0.0, -1.0, 0.0, 0.0)
time.sleep(6)
drone_.land()
time.sleep(3)
本文标签: pythonARDrone20 No Definitive Movement When Executing Move CommandsStack Overflow
版权声明:本文标题:python - AR.Drone2.0: No Definitive Movement When Executing Move Commands - Stack Overflow 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/questions/1745614476a2159204.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论