6.2 基础接口使用

本节导航


6.2.1 最简单的Python3文件运行测试

  • 在“RflySimAPIs\Python38Scripts”文件夹内,新建一个txt文件,并重命名为hello.py
  • 右键该文件,用VS Code打开,在其中敲入如下代码print("Hello, RflySim!")
  • 在VS Code中运行,如右图查看结果
  • 同理,双击Python38Env桌面快捷方式或 “RflySimAPIs\Python38Env.bat”, 如下图查看运行结果

6.2.2 基础Python3语法学习


6.2.3 基础Python-OpenCV学习


6.2.4 Pymavlink的学习

  • Pymavlink是MAVLink通信协议的Python版本,目前已经预装在平台Python环境中,通过它可以方便的通过串口、UDP、TCP等方式与Pixhawk真机通信,进行顶层控制
  • 官方文档网址如下:https://mavlink.io/en/mavgen\_python
  • 请自行学习其详细使用方法
  • :Pymavlink只是一个方便使用的库函数,如果有更高的自定义需求,需要学习MAVLink协议的使用方法

6.2.5 RflySim中Python控制接口介绍

  • “RflySimAPIs\PythonVisionAPI\1-PX4MavCtrlAPITest\PX4MavCtrlV4.py”文件是RflySim平台的Python控制接口文件
  • 本接口包含了MAVLink消息的收发、UE4场景控制、Pixhawk的Offboard控制等接口。
  • 本接口底层数据为MAVLink格式,可以连接RflySim系统进行软/硬件在环仿真,也可以连接真实Pixhawk硬件(通过串口或UDP网络)进行真机的控制

6.2.6 PX4MavCtrlV4内部原理

  • class PX4_CUSTOM_MAIN_MODE:#PX4主模块枚举变量,用于设置模式
  • class PX4_CUSTOM_SUB_MODE_AUTO: #PX4子模块枚举变量
  • class PX4MavCtrler: # RflySim的主要通信接口类
  • def InitMavLoop: #启用MAVLink接收线程,随时接收并更新MAVLink消息
  • def sat: #一个饱和函数,用于控制变量的限幅
  • def SendMavCmdLong : #发送MAVLink消息的COMMAND_LONG消息
  • def sendMavOffboardCmd : # 发送Offboard命令给飞控,使其进入Offboard模式
  • def sendMavOffboardAPI : # 更新Offboard消息的数据(该数据会以一定频率发送)
  • def SendVelNED : # 发送地球坐标系速度指令
  • def sendUE4Cmd : # 发送命令给UE4,控制UE4的显示
  • def sendUE4Pos : # 发送一个物体的三维坐标给UE4,使显示一个物体
  • def SendVelFRD: #发送机体速度
  • def SendPosNED: #发送NED位置,让飞机飞到指定位置(相对解锁点)
  • def initOffboard: # 初始化Offboard模式
  • def endOffboard: # 结束Offboard模式
  • def sendMavSetParam: # 发送MAVLink消息改变Pixhawk参数
  • def SendHILCtrlMsg : #发送rfly_msg消息到飞控(见第3讲4.3节内容)
  • def SendMavArm : #发送解锁命令
  • def SendRcOverride : #发送并模拟遥控器信号
  • def sendMavManualCtrl : #发送并模拟归一化遥控器信号
  • def SendSetMode : #发送并设置Pixhawk模式
  • def stopRun : #停止运行MAVLink数据接收线程
  • def getMavMsg : #更新MAVLink接收的数据

6.2.7 接口使用例子

  • “1-PX4MavCtrlAPITest\PX4MavCtrlAPITest.py”是一个接口使用的Python例子,具体代码解析如下:
    #新建一个MAVLink通信实例,CopterSim接口是20100
    mav = PX4MavCtrl.PX4MavCtrler(20100)
    # RflySim3D样式调整API: sendUE4Cmd函数
    # 样式mav.sendUE4Cmd(cmd,windowID=-1),其中cmd应该输入字符串
    # 向RflySim3D发送窗口调整命令,cmd为具体命令字符串,windowID为接收的窗口号(设同时打开了多个RflySim3D窗口),-1表示发送给所有窗口
    # RflyChangeMapbyName命令表示切换地图,后面跟的字符串为地图名字,这里将所有打开窗口切换为草地地图Grasslands
    mav.sendUE4Cmd(b'RflyChangeMapbyName Grasslands)
    # RflySim3D生成三维物体并控制位姿姿态API: sendUE4Pos函数
    # 样式mav.sendUE4Pos(CopterID, VehicleType, RotorSpeed, PosM, AngEulerRad, windowsID=0)
    mav.sendUE4Pos(100,30,0,[2.5,0,-8.086],[0,0,math.pi])
    # 向RflySim3D发送并生成一个三维物体,其中:物体ID为CopterID=100;
    # 飞机类型VehicleType=30(人物);旋翼转速RotorSpeed=0RPM;位置坐标PosM=[2.5,0,-8.086]m
    # 飞机姿态角AngEulerRad=[0,0,math.pi]rad (旋转180度面对飞机), 接收窗口号默认windowsID=-1(发给所有打开的RflySim3D程序)
    # VehicleType:3四旋翼,5/6六旋翼,30人物,40标定棋盘格,50/51车,60球状发光灯,100飞翼固定翼,150/152环形方形靶标
    # RflyChange3DModel命令后跟 飞机ID + 期望样式,其中期望12的样式是行走的人`mav.sendUE4Cmd(b'RflyChange3DModel 100 12’)`
    # 发送消息,使所有场景中的CopterID=100(刚创建的人物)变成行走的人的样式
    # 命令RflyChangeViewKeyCmd表示模拟RflySim3D的快捷键操作,B 1快捷键表示将焦点切
    换到CopterID=1的对象
    # 这里设定向0号窗口发送,其他窗口不发送
    mav.sendUE4Cmd(b'RflyChangeViewKeyCmd B 1',0)
    # V 1快捷键表示将视角切换到第1号机载摄像头(前置摄像头)
    mav.sendUE4Cmd(b'RflyChangeViewKeyCmd V 1',0)
    # RflyCameraPosAng x y z roll pith yaw 设置相机相对机体中心的位置方向,默认给0
    # 这里设置前置相机的位置为[0.1 0 0]
    mav.sendUE4Cmd(b'RflyCameraPosAng 0.1 0 0',0)
    # r.setres 720x405w 是UE4内置的命令,表示切换分辨率到720x405
    mav.sendUE4Cmd(b'r.setres 720x405w',0)
    # 向1号窗口发送快捷键命令,将焦点切换到飞机1
    mav.sendUE4Cmd(b'RflyChangeViewKeyCmd B 1',1)
    # 向1号窗口发送快捷键控制命令,N 1 快捷键表示将视角切换到地面固定视角1
    mav.sendUE4Cmd(b'RflyChangeViewKeyCmd N 1',1)
    # 这里设置相机的位置为[-2 0 -9.7]
    mav.sendUE4Cmd(b'RflyCameraPosAng -2 0 -9.7',1)
    #开启MAVLink监听CopterSim数据,并实时更新,数据见右下图
    mav.InitMavLoop()
    #显示从CopterSim收到的位置信息
    print(mav.uavPosNED)
    #开启Offboard模式
    mav.initOffboard()
    #发送期望位置信号,飞到目标点 0,0,\-1.7位置,偏航角为0
    mav.SendPosNED(0, 0, -1.7, 0)
    #发送解锁命令
    mav.SendMavArm(True)
    #发送期望速度信号,0.2m/s向下降落,z轴向下为正
    mav.SendVelNED(0, 0, 0.2, 0)
    #退出Offboard控制模式
    mav.endOffboard()
    #退出MAVLink数据接收模式
    mav.stopRun()
    

    6.2.8 VS Code Python调试功能开启

    为了方便观察每一行Python代码的运行结果,这里需要开启Python的调试功能,配置流程如下:
  • 双击“RflySimAPIs\Python38Env.bat”打开Python环境,并输入指令“pip install pylint”来安装Python检查器pylint,安装成功的结果如下图
  • 关闭窗口,开始用VS Code进行代码调试

6.2.9 接口使用例子

  • 在Windows资源管理器中定位到“RflySimAPIs\Python VisionAPI\1-PX4MavCtrlAPITest”文件夹
  • 双击“PX4MavCtrlAPITest.bat”脚本来打开一个飞机的PX4 SITL仿真系统
  • 用VS Code打开“PX4MavCtrlAPITest.py”文件,如右图在每条关键语句前面点上断点(红点),按下图所示开启调试模式,点右下图箭头按钮,依次执行语句

6.2.10 接口例子实验效果

  • 本例程的现象是,python程序发送一系列指令,在RflySim3D程序中新建了一个走动的人的目标,设置 了视角形式、尺寸、位置,向仿真的无人机发送控制指令使其起飞与降落。
  • 如右图所示,本例子会打开两个RflySim3D窗口,一个是前置摄像头,一个是上帝视角观测 :如果电脑性能不佳导致飞行抖动,可以手动关闭后打开的RflySim3D窗口(观察视角)30
  • 在图1所示“PX4MavCtrlAPITest.bat”脚本开启的命令提示符窗口中,按下回车键(任意键)就能快速关闭CopterSim、QGC、RflySim3D等所有程序。
  • 如图2,在VS Code中按本讲1.5节步骤,点击“终止终端”,退出脚本运行
  • 关闭“PX4MavCtrlAPITest.py”打开的VS Code窗口 * 注:PX4MavCtrlV4.py增加了仿真真值的获取接口(mav.true*变量),send2UE4创建障碍增加20和100飞机接口,增加创建物体直接贴合地形功能

    图1


图2


6.2.11 Python从RflySim3D取图接口

  • 本脚本使用Windows系统的Win32API函数库来抓取Unreal的窗口句柄并实现可遮挡的窗口图像抓取

  • 下图为本接口最关键的取图函数,可以获取到OpenCV能够直接使用的图像格式,用于后续的图像处理和MAVLink闭环控制

results matching ""

    No results matching ""