ardupilot开发 --- Lua脚本篇

这篇具有很好参考价值的文章主要介绍了ardupilot开发 --- Lua脚本篇。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 一些概念

  • ArduPilot引入了对Lua脚本的支持;
  • 可以同时运行多个脚本;
  • Lua脚本存放在 SD card 中;
  • Copter-4.0 及以上版本才支持Lua脚本;
  • scripting API ?scripting applets ?
  • 飞控条件:2 MB of flash and 70 kB of memory ;
  • 将Lua脚本上传到 SD card’s APM/scripts 文件夹中,在Mission Planner使用MAVFTP可以上传文件;

2. Lua的作用?

Multiple scripts can be run at once
Monitor the vehicle state
Start to manipulate vehicle state

3. 什么时候开始执行Lua脚本?

当自动驾驶仪通电时,它将加载并启动所有脚本。
并在以下目录中寻找脚本:

  • 它将在ROMFS文件系统
  • SD卡上的 APM/scripts
  • 如果是SITL模拟,则是启动模拟的 base directory

这可以通过使用 SCR_DIR_DISABLE参数进行修改。

4. 相关参数

  • 使能:SCR_ENABLE
  • 此外,还有四个专用的脚本参数可用: SCR_USER1 ~ SCR_USER4, 使用与任何其他参数相同的方法访问,但这些参数是为脚本使用而保留的。脚本还可以生成自己的参数(请参阅Accessing/Adding Parameters via Scripts),以便在脚本中使用。
  • 可以调整 SCR_HEAP_SIZE 以增加或减少可用于脚本的内存量。默认值从43K到204.8K不等,具体取决于使用的cpu,对于小脚本来说,最小值(43K)就足够了,但许多小程序需要更多(一些小程序现在需要300K)。自动驾驶仪的空闲内存在很大程度上取决于启用了哪些功能和外围设备。如果此参数设置得太低,脚本可能无法运行,并出现内存不足的预启动错误。如果设置过高,其他自动驾驶功能,如地形跟随,甚至EKF可能无法初始化。在配备STM32F4微控制器的自动驾驶仪上,几乎总是需要禁用Smart RTL(漫游者、科普特)和Terrain Following(飞机、科普特(Copter))。这些功能通常在默认情况下启用,设置SRTL_PPOINTS=0,TERRAIN_ENABLE=0)

5. RCx_OPTION 配置成 Scriptingx 后如何在脚本中使用

通过遥控器通道控制脚本的执行;
local rc_switch = rc:find_channel_for_option(24)
local sw_pos = rc_switch:get_aux_switch_pos() %%0,1,2 低位中位高位
例如,300即Scripting1,301即Scripting2:

-- example of getting RC input

local scripting_rc_1 = rc:find_channel_for_option(300)
local scripting_rc_2 = rc:find_channel_for_option(301)
local flip_flop = 0

function update()
  pwm1 = rc:get_pwm(1)
  pwm2 = rc:get_pwm(2)
  pwm3 = rc:get_pwm(3)
  pwm4 = rc:get_pwm(4)
  gcs:send_text(0, "RCIN 1:" .. tostring(pwm1) .. " 2:" .. tostring(pwm2).. " 3:" .. tostring(pwm3).. " 4:" .. tostring(pwm4))

  -- read normalized input from designated scripting RCx_OPTION
  if scripting_rc_1 then
    gcs:send_text(0, "Scripting in 1:" .. tostring(scripting_rc_1:norm_input()))
  end

  -- read switch input from second designated scripting RCx_OPTION
  if scripting_rc_2 then
    local sw_pos = scripting_rc_2:get_aux_switch_pos()
    if sw_pos == 0 then 
      gcs:send_text(0, "Scripting switch is low")
    elseif sw_pos == 1 then
      gcs:send_text(0, "Scripting switch is middle")
    else
      gcs:send_text(0, "Scripting switch is high")
    end
  end

  -- we can also call functions that are available to RC switches
  -- 28 is Relay one
  rc:run_aux_function(28, flip_flop)

  if (flip_flop == 0) then
    flip_flop = 2 -- switch high
  else
    flip_flop = 0 -- switch low
  end


  return update, 1000 -- reschedules the loop
end

return update()

6. 使用文档、参考例程

文档
例程:ardupilot\libraries\AP_Scripting\examples

7. 函数绑定

  • 绑定的代码实现:
    libraries\AP_Scripting\generator\description\bindings.desc
  • 类的“别名
    在绑定中,通常会给“”(原文称group)取别名,如:
    AP_AHRS 的别名为 ahrs
    AP_GPS 的别名为 gps
    定义方式:
    singleton AP_AHRS rename ahrs

    singleton AP_AHRS alias ahrs
  • 如何绑定函数
    为什么要绑定函数?因为只有绑定了该函数,该函数才能在lua脚本中被调用!
    绑定格式:
    singleton 类名 method 函数名 函数返回值类型 输入参数类型/范围
    e.g :
    • 无输入参数:
      singleton AP_Arming method is_armed boolean
    • 有一个输入参数,该参数有取值范围:0 ~ AP_RELAY_NUM_RELAYS
      singleton AP_Relay method on void uint8_t 0 AP_RELAY_NUM_RELAYS
    • 输入参数可为null:
      singleton AP_AHRS method get_variances boolean float’Null float’Null float’Null Vector3f’Null float’Null
  • userdata的使用
    功能:假如要绑定的函数的输出或返回值类型是结构体或类,怎么办?这时就需要使用userdata。
    以下面这个函数绑定为例:
    singleton AP_Mission method set_item boolean uint16_t’skip_check mavlink_mission_item_int_t
    显而易见输入参数 mavlink_mission_item_int_t 是个类或结构体类型
    用userdata分解式定义这个参数:
    如何知道mavlink_mission_item_int_t 都包含哪些内容呢?去C++源码中搜索发现找不到这个类型的定义,只有一堆引用,她实质上是MavLink库中的一个数据类型,去MavLink网站中搜索关键词“MISSION_ITEM_INT”可知:
    ardupilot开发 --- Lua脚本篇,无人机/建模/PX4/Adurpilot/Pixhawk,Ardupilot
    用userdata分解式定义这个参数:
userdata mavlink_mission_item_int_t field param1 float'skip_check read write
userdata mavlink_mission_item_int_t field param2 float'skip_check read write
userdata mavlink_mission_item_int_t field param3 float'skip_check read write
userdata mavlink_mission_item_int_t field param4 float'skip_check read write
userdata mavlink_mission_item_int_t field x int32_t'skip_check read write
userdata mavlink_mission_item_int_t field y int32_t'skip_check read write
userdata mavlink_mission_item_int_t field z float'skip_check read write
userdata mavlink_mission_item_int_t field seq uint16_t'skip_check read write
userdata mavlink_mission_item_int_t field command uint16_t'skip_check read write
-- userdata mavlink_mission_item_int_t field target_system uint8_t'skip_check read write
-- userdata mavlink_mission_item_int_t field target_component uint8_t'skip_check read write
userdata mavlink_mission_item_int_t field frame uint8_t'skip_check read write
userdata mavlink_mission_item_int_t field current uint8_t'skip_check read write
-- userdata mavlink_mission_item_int_t field autocontinue uint8_t'skip_check read write
  • 如何使用某类中的函数?
    给类定义好别名并且绑定该函数后,就可以通过下面方式调用该函数,如:
    roll = ahrs:get_roll()

  • 使用示例:

  local item = mavlink_mission_item_int_t() 
  item:seq(index+1)
  item:frame(3)
  item:command(16)
  item:param1(0.0)
  item:param2(0.0)
  item:x(0.0)
  item:y(0.0) 
  loc1:lat(lat_of_center)
  loc1:lng(lon_of_center)
  local offset_x,offset_y
  mission:set_item(mission:num_commands(),item)

item:command(16) 即:
ardupilot开发 --- Lua脚本篇,无人机/建模/PX4/Adurpilot/Pixhawk,Ardupilot

但MAV_CMD_NAV_WAYPOINT中并没有x,y这两个参数?原来是lua重新定义参数结构体了:

ardupilot开发 --- Lua脚本篇,无人机/建模/PX4/Adurpilot/Pixhawk,Ardupilot
去AP_Mission.cpp中找到set_item函数查看具体用法,逻辑,最后会跳转到以下函数中:

MAV_MISSION_RESULT AP_Mission::mavlink_int_to_mission_cmd(const mavlink_mission_item_int_t& packet, AP_Mission::Mission_Command& cmd)
{ 
    cmd.id = packet.command;   
    // command specific conversions from mavlink packet to mission command
    switch (cmd.id) {  
	    case MAV_CMD_NAV_WAYPOINT: { 
	    ...
	    }
    }
    ...
    // copy location from mavlink to command
    cmd.content.location.lat = packet.x;
    cmd.content.location.lng = packet.y;
    ...
}

8. 自己写的一个例子

功能:用lua脚本生成风机航迹点
https://download.csdn.net/download/weixin_43321489/88647127

9. LUA中添加参数并在地面站中显示

参考:https://ardupilot.org/dev/docs/common-scripting-parameters.html

function readPara()
    local DIST_HUB = Parameter()
    DIST_HUB:init('WPCRT_DIST_HUB')
    distFromHub = DIST_HUB:get()

    local AG_EAST = Parameter()
    AG_EAST:init('WPCRT_AG_EAST')
    angleFirstBladeRotateToEast = AG_EAST:get()

    local AG_LEVEL = Parameter()
    AG_LEVEL:init('WPCRT_AG_LEVEL')
    angleFirstBladeFromLevel = AG_LEVEL:get()

    local BL_LEN = Parameter()
    BL_LEN:init('WPCRT_BL_LEN')
    bladeLength = BL_LEN:get()

    local MIN_ALT = Parameter()
    MIN_ALT:init('WPCRT_MIN_ALT')
    wayPointMinAlt = MIN_ALT:get()

    if distFromHub>0 and angleFirstBladeRotateToEast~=nil and angleFirstBladeFromLevel~=nil and bladeLength>0 and wayPointMinAlt>0 then 
        gcs:send_text(0, string.format("MISSION CREATION START!!"))
        gcs:send_text(0,string.format("distFromHub: %f ",distFromHub))
        gcs:send_text(0,string.format("angleFirstBladeRotateToEast: %f ",angleFirstBladeRotateToEast))
        gcs:send_text(0,string.format("angleFirstBladeFromLevel: %f ",angleFirstBladeFromLevel))
        gcs:send_text(0,string.format("bladeLength: %f ",bladeLength))
        gcs:send_text(0,string.format("wayPointMinAlt: %f ",wayPointMinAlt))
        return true
    else
        gcs:send_text(0, string.format("参数异常!!"))
        gcs:send_text(0, string.format("MISSION CREATION START!!"))
        gcs:send_text(0,string.format("distFromHub: %f ",distFromHub))
        gcs:send_text(0,string.format("angleFirstBladeRotateToEast: %f ",angleFirstBladeRotateToEast))
        gcs:send_text(0,string.format("angleFirstBladeFromLevel: %f ",angleFirstBladeFromLevel))
        gcs:send_text(0,string.format("bladeLength: %f ",bladeLength))
        gcs:send_text(0,string.format("wayPointMinAlt: %f ",wayPointMinAlt))
        return false 
    end
end
function createPara()
    local PARAM_TABLE_KEY = 0 --0~200
    assert(param:add_table(PARAM_TABLE_KEY, "WPCRT_", 10), 'could not add param table') -- WPCRT: way points create
    assert(param:add_param(PARAM_TABLE_KEY, 1,  'DIST_HUB', 50), 'could not add param DIST_HUB')
    assert(param:add_param(PARAM_TABLE_KEY, 2,  'AG_EAST', 0), 'could not add param AG_EAST')
    assert(param:add_param(PARAM_TABLE_KEY, 3,  'AG_LEVEL', 0), 'could not add param AG_LEVEL')
    assert(param:add_param(PARAM_TABLE_KEY, 4,  'BL_LEN', 20), 'could not add param BL_LEN')
    assert(param:add_param(PARAM_TABLE_KEY, 5,  'MIN_ALT', 15), 'could not add param MIN_ALT')
end

10. 系统函数

已经定义好的函数,可以直接用:
在docs.lua中查看例程

lua引擎中没有定义uint64_t的数据类型,如何绑定具有uint64_t数据的函数?

用char * 代替uint64_t
例如:
char* AP_RTC::get_utc_usecStr( )
{
if (rtc_source_type == SOURCE_NONE) {
std::string tmp=“false”;
strcpy(luaData,tmp.c_str());
return luaData;
}
uint64_t usec = AP_HAL::micros64() + rtc_shift;
std::string usecStr = std::to_string(usec);
strcpy(luaData,usecStr.c_str());
return luaData;
}
其中:luaData定义在AP_RTC类中: char luaData[64];

11. 编程知识点拾遗

lua的数据类型只有以下几种,没有int和uint:
ardupilot开发 --- Lua脚本篇,无人机/建模/PX4/Adurpilot/Pixhawk,Ardupilot
但是int和uint_32这种可以定义成userdata。
local a=1 和 local a=1.0 是一样的,a的数据类型都是number。
打印时,%u,%d,%f都可以用来显示a,只是精度不同而已!!!
常用函数:

-- create uint32_t_ud with optional value
---@param value? number|integer
---@return uint32_t_ud
function uint32_t(value) end

-- Convert to number
---@return number
function uint32_t_ud:tofloat() end

-- Convert to integer
---@return integer
function uint32_t_ud:toint() end

例子:

local n = 1
n = n+3.14
local m= uint32_t(n):toint()
gcs:send_text(0, string.format("n is %f ", n))
gcs:send_text(0, string.format("m is %f ", m))  
gcs:send_text(0, string.format("type(n) is %s ", type(n)))
gcs:send_text(0, string.format("type(m) is %s ", type(m)))

结果:
ardupilot开发 --- Lua脚本篇,无人机/建模/PX4/Adurpilot/Pixhawk,Ardupilot文章来源地址https://www.toymoban.com/news/detail-666667.html

到了这里,关于ardupilot开发 --- Lua脚本篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【无人机】PIXHAWK、PX4、APM区别

    PIXHAWK、PX4、APM APM固件 专为Arduupilot开发的固件,现也用于PIXHAWK。有ArduCopter社区支撑、开放,功能全、迭代升级快,适合直接用。由于有较多的历史兼容性需求,软件代码体系相对杂乱,还封装了PX4的内核,学习起来困难些。 PX4固件 专为PIXHAWK开发的固件。相对封闭,代码体

    2024年02月20日
    浏览(58)
  • px4+vio实现无人机室内定位

    文章主要讲述px4 如何利用vins_fusion里程计数据实现在室内定位功能。 文章基于以下软、硬件展开。 硬件 软件 机载电脑: Intel NUC 系统:Ubuntu 20.04 相机: Intel Realsense D435i ros:noetic 飞控:Pixhawk 2.4.8 固件:PX4 1.14.0 完整vins_to_mavros 功能包地址: https://github.com/rotorcraftman/px4ctr

    2024年02月03日
    浏览(48)
  • Ubuntu PX4无人机仿真环境配置

     目录 一、VM虚拟机安装ubuntu18.04   1、VMware安装   2、新建虚拟机 二、Ubuntu系统配置   1、更改软件安装源   2、安装中文输入法 三、PX4环境搭建   1、安装git   2、下载px4源码   3、安装ROS   4、安装MAVROS   5、安装QGC   6、仿真测试 四、其他工具安装   1、VScode安装      

    2024年02月02日
    浏览(189)
  • 无人机仿真—PX4编译,gazebo仿真及简单off board控制模式下无人机起飞

    在上篇记录中,已经对整体的PX4仿真环境有了一定的了解,现如今就要开始对无人机进行起飞等仿真环境工作,在整体虚拟环境中如果程序能够安稳起飞降落,即可对无人机进行实飞操作。 需要做的是,通过PX4官网提供的基本程序包,在ROS工作空间下新建程序包对其进行运行

    2024年02月03日
    浏览(121)
  • 完整的Ubuntu20.04+ROS+PX4+Anaconda+PyTorch+GPU+CUDA+CUDNN+XTdrone配置智能无人机开发环境搭建过程

    我之前写了如何在Ubuntu18下搭配一系列软件的教程,然后近期重新安装20.04版本,于是重新记录一些东西,但是众多东西之前已经有了,所以我在这里知会在一些不同的地方和新增的地方特别说明,其他的请大家看之前的博客。 在搞了这么久的ros和px4之后,我也明白了xtdrone是

    2024年02月05日
    浏览(70)
  • PX4学习笔记——无人机以及QGC操作

    官方教程链接:https://docs.qgroundcontrol.com/master/en/SetupView/SetupView.html 电脑先打开QGC,进入Vehicle Setup,点击Firmware。无人机飞控使用USB线连接电脑,然后选择烧录的.px4程序(可以是官方的,也可以是自己编译生成的)。 点击Airframe,如果无人机为四旋翼,则点击 Generic Quadcopter

    2024年02月11日
    浏览(46)
  • 【PX4-AutoPilot教程-TIPS】PX4控制无人机在Gazebo中飞行时由于视角跟随无人机在画面中心导致视角乱晃的解决方法

    无人机在Gazebo中飞行时,无人机始终处于画面中央,会带着视角乱晃,在Gazebo中进行任何操作视角都无法固定。 观察Gazebo左侧World栏GUI选项,发现有一个track_visual项,这个是Gazebo中的跟随视角,跟踪目标是无人机iris,但是手动点击无法取消,设置Gazebo使用FOLLOW选项跟随其他目

    2024年02月22日
    浏览(84)
  • Pixhawk无人机-ArduPilot 软件SITL仿真模拟飞行(SITL+Mission Planner结合)

    本文的目的是将SITL仿真结合Missionplanner地面站,之后再探索SITL仿真结合QGC地面站。 Pixhawk无人机扩展教程(7)—SITL+MP/QGC运行教程中指出,QGC地面站是安装在与SITL仿真软件一起的笔记本电脑上的,而MP地面站是安装在另外一台笔记本电脑上的。因此要注意连接IP地址的区别。 当

    2024年02月12日
    浏览(120)
  • ubuntu搭建PX4无人机仿真环境(4) —— 仿真环境搭建

    前言 在搭建之前,需要把 ROS、MAVROS、QGC 等基础环境安装配置完成。大家可以参考我之前的教程 本次安装是以 px4 v1.13.2 为例。 我的配置如下: 虚拟机 Ubuntu 18.04 (运行内存 4G、硬盘内存 80G) 、ROS melodic 、最新版 QGC 建议安装之前可以先看看这个 👉 ubuntu搭建PX4无人机仿真环境

    2024年02月15日
    浏览(76)
  • (最新)ubuntu搭建PX4无人机仿真环境(4) —— 仿真环境搭建

    前言 在搭建之前,需要把 ROS、MAVROS、QGC 等基础环境安装配置完成。大家可以参考我之前的教程 本次安装是以 px4 v1.13.2 为例。 我的配置如下: 虚拟机 Ubuntu 18.04 (运行内存 4G、硬盘内存 80G) 、ROS melodic 、最新版 QGC 建议安装之前可以先看看这个 👉 ubuntu搭建PX4无人机仿真环境

    2024年02月09日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包