进入航空网第2集:无人机


上一篇文章中,我们研究了向空中发射自动虚拟无人机的过程。 在老师的指导下,即使是学童也设法按照此说明发射无人机。 问题出现了:下一步呢? 好吧,无人驾驶飞机,飙升。 此外,虚拟-在玩具和模拟器中,并且绘制得更精美。


下一步,我们建议创建一种能够看到您的目标并成功实现目标的寻的无人机。 使用彩色气球作为目标是最简单的。


这项任务(用无人驾驶无人机击球)是最近由全俄Robocross-2019的Aeronet部门的团队执行的。 我们受到了美国乐队首张专辑中的歌曲“ Seek and destroy”的启发,该专辑在我动荡的青年时期非常受欢迎。
在接下来的系列文章中,我们将研究如何教自主无人机遵循上述歌曲的简单指导。


因此,我们需要以下内容:


  1. 我们可以通过程序控制的飞行无人机
  2. 目标识别和指导系统
  3. 将前两点结合在一起-瞧,您可以竞争,它的无人机将飞行得更快,球更多。

接下来,首先要做的是。


jMAVSim键盘控制


像上面的图片一样,想象一下无人驾驶飞机看到一个球。 无人机的摄像头正前方。


要在球上飞行,我们的无人机必须能够:向前/向后移动,向左和向右旋转,上下飞行。 球不仅会由于阵风而在相机镜头中移动,而且还会因为无人机沿侧倾和俯仰方向的倾斜而移动,但到目前为止,我们忽略了这些倾斜。


我们将通过通过mavros向主题/mavros/setpoint_velocity/cmd_vel_unstamped发送消息来控制无人机的速度。


为了从键盘上操纵无人机,我们使用curses模块( 用俄语描述用英语 描述 )。


该算法很简单:所需速度的当前值存储在类型为geometry_msgs.msg.Twist的setvel变量 。 通过按下键盘上的按钮,我们可以增加/减少所需的速度分量。 通过计时器每秒20次,我们将速度发布到指定的主题中。


对于前进速度(相对于无人机),需要进行说明。 事实是,必须在无人机飞行的“世界”的本地坐标系中设置飞行速度。 因此,您需要在此坐标系中跟踪无人机的当前位置(姿势)。 无人机的X轴相对于“世界”的X轴旋转一定角度偏航。 Mavros在主题/mavros/local_position/pose中的“世界”坐标中发布无人机的当前位置。 为了获得并在世界坐标中发布所需的无人机速度而从该位置获得了偏航角,我们分别将所需的前进速度setvel_forward乘以世界X轴的cos(偏航)和世界Y轴的sin(偏航)。



程序全文:
 #!/usr/bin/env python # coding=UTF-8 import rospy import mavros import mavros.command as mc from mavros_msgs.msg import State from geometry_msgs.msg import PoseStamped, Twist, Quaternion from mavros_msgs.srv import CommandBool from mavros_msgs.srv import SetMode import tf.transformations as t import math current_state=State() current_pose = PoseStamped() current_vel = Twist() def localpose_callback(data): global current_pose current_pose = data def publish_setvel(event): global current_pose, setvel_pub, setvel, setvel_forward q=current_pose.pose.orientation.x, current_pose.pose.orientation.y,current_pose.pose.orientation.z,current_pose.pose.orientation.w roll, pitch, yaw = t.euler_from_quaternion(q) setvel.linear.x = setvel_forward * math.cos(yaw) setvel.linear.y = setvel_forward * math.sin(yaw) setvel_pub.publish(setvel) def main(): global current_pose, setvel, setvel_pub, setvel_forward rospy.init_node("offbrd",anonymous=True) rate=rospy.Rate(10) pose_sub=rospy.Subscriber("/mavros/local_position/pose",PoseStamped,localpose_callback) setvel_pub=rospy.Publisher("/mavros/setpoint_velocity/cmd_vel_unstamped",Twist,queue_size=1) arming_s=rospy.ServiceProxy("/mavros/cmd/arming",CommandBool) set_mode=rospy.ServiceProxy("/mavros/set_mode",SetMode) setvel=Twist() setvel_forward = 0 arming_s(True) set_mode(0,"AUTO.TAKEOFF") print 'Taking off.....\r' rospy.sleep(5) # keyboard manipulation import curses stdscr = curses.initscr() curses.noecho() stdscr.nodelay(1) stdscr.keypad(1) for i in range (0,10): setvel_pub.publish(setvel) rate.sleep() set_mode(0,"OFFBOARD") setvel_timer = rospy.Timer(rospy.Duration(0.05), publish_setvel) while (rospy.is_shutdown()==False): rate.sleep() # keyboard hcommands handling c = stdscr.getch() if c == ord('q'): break # Exit the while() elif c == ord('u'): setvel.linear.z += 0.25 elif c == ord('d'): setvel.linear.z -= 0.25 elif c == curses.KEY_LEFT: setvel.angular.z += 0.25 elif c == curses.KEY_RIGHT: setvel.angular.z -= 0.25 elif c == curses.KEY_UP: setvel_forward += 0.25 elif c == curses.KEY_DOWN: setvel_forward -= 0.25 elif c == ord('s'): setvel_forward=setvel.linear.z=setvel.angular.z=0 if c!=curses.ERR: print setvel,'\r' curses.endwin() set_mode(0,"AUTO.LAND") print 'Landing.......\r' if __name__=="__main__": main() 

要运行程序以执行程序,我们需要运行jMAVSim,并使用roslaunch mavros命令将mavros连接到它(如果没有自动启动,则在运行roscore之后):


 roslaunch mavros mavros_sitl.launch fcu_url:="udp://@192.168.7.14:14580" 

确保我们使用rostopic echo / mavros / state连接。 连接字段必须为= True。


之后,将程序代码保存到文件中,然后使用python fly_mavsim.py运行它。 虚拟直升机应升至大约2米的高度(在QGroundControl的MIS_TAKEOFF_ALT参数中设置了起飞高度)并冻结。 使用键盘上的按钮,可以对其进行控制:左右箭头-旋转,上下箭头-向前/向后移动,u-向上飞(向上),d-向下飞(向下),s-挂在适当位置(停止,所有速度= 0),q-退出程序(QUIT)并降落直升机。


您可以在虚拟世界中飞行,检查理想的虚拟无人机在飞行中的行为。


飞行中的无人机


总结了击键速度的变化,您可以使无人机围绕特定点绕圈旋转,成螺旋形飞行,并模拟目标系统。


然后,乐趣就开始了:从真空中的球形无人驾驶飞机,我们进入了现实世界。


键盘控制的真实无人机


网络上有许多有关在PX4堆栈上组装和配置直升飞机的说明。 开发人员文档中对该过程进行了详细描述。


由于我使用的是现成的无人机,因此在系统的组装和初步配置过程中,这使我免于多次蹲坐。


作为车载计算机,我们使用安装了Raspbian + ROS Kinetic的Raspberry PI 3 Model B +。 根据计划,Raspberry通过uart连接到Pixracer飞行控制器:


Pixracer +树莓派PI


GPS模块已连接至飞行控制器的GPS端口。 我使用的是Radiolink的TS100模块,质量很好,成本也不高。


可以按照说明自行安装ROS Kinetic。 在Raspberry上,您应该通过Wifi和ssh配置访问权限( 例如,这是一条说明 )。


您也可以使用“直升机快车”公司为Raspberry提供的现成图像 。 在这种情况下,您应该禁用默认的聪明软件包,我们不需要:


 sudo systemctl stop clever sudo systemctl disable clever 

这里描述另一个带有ROS和OpenCV的Raspberry映像,我在工作中没有尝试过,但是使用的工具是相似的。


打开无人机并通过ssh连接到Raspberry之后,我们启动mavros并检查与飞行控制器的连接:


 roslaunch mavros px4.launch fcu_url:='/dev/ttyAMA0:921600' gcs_url:='tcp-l://0.0.0.0:5760' rostopic echo /mavros/state 

如果一切正常,我们将每秒收到一则关于飞行控制器状态的消息,其字段为Connected = True。



需要gcs_url调用中的gcs_url参数,以便我们可以通过TCP桥接器通过WiFi将QGroundControl连接到无人机的飞行控制器。 连接参数在QGroundControl中设置:



为准备无人驾驶飞机的无人机,我遵循一些简单的步骤:


1.确保无人机在手动模式下飞行良好。 为此,必须选择正确的参数设置并校准所有传感器。 此时,使用市售的无人机使我免于麻烦。 我使用了启用了GPS和气压计的LPE估算器:



2.如果系统是在新的地方或第一次启动,则应等待GPS模块“热身”。 GPS在街上进行常规工作时,通常会捕获16到22颗卫星。



3.在飞往新地点之前,如果无人机没有抓住一点,则应重新校准指南针:



您应该使用外部指南针,并确保在设置中设置了正确的方向:



如果所有设置均正确设置,则无人机必须放心地将其保持在“保持”模式,并在“位置”模式下稳定飞行。


在手动模式下成功试飞之后,我们可以检查fly_jmavsim.py程序如何在真正的无人机上运行: video


真正的无人机不能像虚拟无人机那样完美飞行-但它还需要服从键盘上的命令-以正确的方向飞行并停止执行该命令。


如果发生这种情况,我们可以使用计算机视觉代替键盘控制,我们将在下一篇文章中讨论有关设置的信息。 最初的猎球测试看起来像这样


我们的飞行控制器+程序代码的设置发布在github上

Source: https://habr.com/ru/post/zh-CN461887/


All Articles