【PX4】PX4第一个offborad例程

2023-09-21 08:45:06

【PX4】PX4第一个offborad例程

1. 什么是OFFBOARD

PX4的OFFBOARD指的是外部控制模式,飞行器根据飞行控制栈外部(如机载计算机)提供的设定值控制位置、速度、加速度、姿态以及推力/力矩。设置值可以经由 MAVLink 提供。
PX4要求外部控制器提供2Hz(至少是2Hz)连续的“有效存在”信号,该信号可由任意支持的 MAVLink 设置点消息或ROS 2 OffboardControlMode 消息提供。 PX4只有在收到该种信号超过1秒后才有效,如果该种信号停止飞行控制栈将重新获得控制权(脱离Offboard模式)。

一些注意点:

  • Offboard模式通过设置位置、速度、加速、姿态、姿态角速率或力/扭矩设置点来控制飞行器的移动和姿态。
  • PX4 必须能够以2Hz的速率连续收到 MAVLink 设置点消息或 ROS 2 OffboardControlMode 消息以确保外部控制器是正常运行的。 该消息必须已经持续发送1秒钟以上PX4才能在Offboard模式下解锁或在飞行中切换至Offboard模式。 如果在外部控制器给出的指令速率低于2Hz,PX4将在超时(COM_OF_LOSS_T)后退出Offboard模式,并尝试降落或执行其他一些失败保护行为。 失效保护行为取决于RC遥控器是否可用,依据参数 COM_OBL_RC_ACT 的设定。
  • 当使用 MAVLink 时,设定值消息既传达了指示外部控制器"正常运行"的信号也传达了设定值本身。 Offboard模式下要保持位置,飞行器必须接收到一个包含当前位置设定值的消息指令。
  • 当使用 ROS 2 时,外部控制器运行正常通过监测 OffboardControlMode 消息流确保,真实设定点由发布任一包含设定值的uORB消息提供,例如 TrajectorySetpoint。 在这种情况下保持当前位置,飞行器必须收到连续的 OffboardControlMode 消息,但只需要收到 TrajectorySetpoint 消息一次。
  • 请注意,Offboard模式只支持非常有限的 MAVLink 命令和消息。 其他操作如起飞、降落、返航,最好使用适当的模式来处理。 像上传、下载任务这样的操作可以在任何模式下执行。

2. 第一个offboard例程

本教程使用 Gazebo Classic 模拟的Iris四旋翼无人机,用MAVROS Python来展示 OFFBOARD 控制的基础知识。

首先创建一个工作空间并进行初始化

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
cd ..
catkin_make

然后在这个工作空间下创建一个功能包,命名为sitl_study依赖rospy

cd ~/catkin_ws/src
catalkin_create_pkg sitl_study rospy

再在功能包中创建我们的scripts目录用于存放python脚本

roscd sitl_study
mkdir scripts
cd scripts

进入scripts目录,创建我们的可执行脚本,命名为offb_node.py,并且添加可执行权限

touch offb_node.py
chmod +x offb_node.py

然后打开offb_node.py添加下面的代码

#! /usr/bin/env python
#-*- coding: UTF-8 -*- 

import rospy
from geometry_msgs.msg import PoseStamped
from mavros_msgs.msg import State
from mavros_msgs.srv import CommandBool, CommandBoolRequest, SetMode, SetModeRequest

current_state = State()

def state_CB(msg):
    global current_state
    current_state = msg


if __name__ == "__main__":
    # initialize ros node
    rospy.init_node('offb_node_py')

    # state subscriber
    state_sub = rospy.Subscriber('/mavros/state', State, callback=state_CB)

    # pose publisher
    local_pose_pub = rospy.Publisher('/mavros/setpoint_position/local', PoseStamped, queue_size=10)
    
    # arming client
    arming_client = rospy.ServiceProxy('/mavros/cmd/arming', CommandBool)
    arming_client.wait_for_service()

    # mode client
    setmode_client = rospy.ServiceProxy('/mavros/set_mode', SetMode)
    setmode_client.wait_for_service()

    # setpoint publishing MUST be faster than 2HZ
    rate = rospy.Rate(20)

    # wait for Flight Controller connection
    while (not rospy.is_shutdown() and not current_state.connected):
        rate.sleep()
    
    # set point
    pose = PoseStamped()
    pose.pose.position.x = 0
    pose.pose.position.y = 0
    pose.pose.position.z = 2.0

    # send a few setpoints before starting
    for i in range(20):
        if(rospy.is_shutdown()):
            break
        local_pose_pub.publish(pose)
        rate.sleep()
    
    # set OFFBOARD mode
    offb_set_mode = SetModeRequest()
    offb_set_mode.custom_mode = 'OFFBOARD'

    # arm vehicle
    arm_cmd = CommandBoolRequest()
    arm_cmd.value = True

    # request time
    last_req = rospy.Time.now()

    while(not rospy.is_shutdown()):
        if (current_state.mode != "OFFBOARD" and (rospy.Time.now() - last_req) > rospy.Duration(5.0)):
            if(setmode_client.call(offb_set_mode).mode_sent == True):
                rospy.loginfo(">>>>>> OFFBOARD enabled >>>>>>")
            last_req = rospy.Time.now()
            
        else:
            if(not current_state.armed and (rospy.Time.now() - last_req) > rospy.Duration(5.0)):
                if(arming_client.call(arm_cmd).success == True):
                    rospy.loginfo(">>>>>> Vehicle armed >>>>>>>")
                last_req = rospy.Time.now()
        
        local_pose_pub.publish(pose)
        rate.sleep()

CMakelists.txt中添加节点路径,如下所示

#############
## Install ##
#############

# all install targets should use catkin DESTINATION variables
# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html

## Mark executable scripts (Python etc.) for installation
## in contrast to setup.py, you can choose the destination
catkin_install_python(PROGRAMS
  scripts/offb_node.py
  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

修改完毕之后,我们首先进行编译

cd ~/catkin_ws
catkin_make
source ./devel/setup.bash

然后我们就可以测试是否编写成功了,首先启动

roslaunch px4 mavros_posix_sitl.launch 

然后再启动

rosrun sitl_study offb_node.py

我们就能看到无人机先解锁然后转到OFFBORAD模式,然后起飞到两米,如下图所示

Image

3. 编写launch文件

虽然上述的启动方式能够实现让飞机启动,但是需要我们手动输入两次命令,非常不优雅,我们可以编写一个launch文件来集成这两者。

roscd sitl_study
mkdir launch
cd launch
touch offb_start.launch

然后打开该文件,输入以下内容

<?xml version="1.0"?>
<launch>
    <!-- Include the MAVROS node with SITL and Gazebo -->
    <include file="$(find px4)/launch/mavros_posix_sitl.launch">
    </include>

    <!-- Our node to control the drone -->
    <node pkg="sitl_study" type="offb_node.py" name="offb_node_py" required="true" output="screen" />
</launch>

然后再进行一次编译

cd ~/catkin_ws
catkin_make
source ./devel/setup.bash

我们就可以在任意路径下启动了

roslaunch sitl_study offb_start.launch

Reference

PX4官网的Offobrad模式介绍
PX4官网的控制例程

更多推荐

kafka rabbitmq 详细对比

Kafka&rabbitmqkafkaProducer:消息生产者,将消息push到Kafka集群中的Broker。Consumer:消息消费者,从Kafka集群中pull消息,消费消息。ConsumerGroup:组团消费,每个Consumer都属于一个ConsumerGroup。消费者组在逻辑上是同一个订阅者。消费

JavaScript学习记录 | DOM事件流 事件冒泡-事件捕获-事件委托

目录DOM事件流常见面试题事件冒泡与事件捕获事件冒泡使用场景事件捕获使用场景事件冒泡和事件捕获区别事件委托-利用事件冒泡机制事件委托应用场景支持事件委托的事件事件委托的优缺点DOM事件流DOM事件流的三个阶段:捕获阶段->目标阶段->冒泡阶段常见面试题事件冒泡和委托是什么?有什么使用场景?事件委托的优点和缺点JS事件绑

线性代数基础-矩阵

八、矩阵的基础概念1.矩阵我们忘掉之前行列式的一切,列一种全新的数表,虽然长得很像,但是大不相同,首先一个区别就是矩阵不能展开成一个值,这里不讨论矩阵的空间意义{a11x1+a12x2+a13x3+...+a1nxn=b1a21x1+a22x2+a23x3+...+a2nxn=b2...an1x1+an2x2+an3x

SQL sever中相关查询

目录一、简单查询二、条件查询三、别名查询四、分组查询五、排序查询六、去重查询七、分页查询八、模糊查询九、表连接查询十、子查询十一、嵌套查询一、简单查询简单查询是最基本的查询类型,用于从数据库中选择特定列或所有列的数据。1.选择所有列的数据:SELECT*FROM表名;将返回指定表中的所有行和列。2.选择特定列的数据:S

酌情参考——chatGPT给的一些语义框架的学术思路,语义和图谱结合似乎是个不错的方向

语义和图谱结合似乎是个不错的方向我在分析教师讲课的文本,以知识元和语义框架建模的话怎么分析合适ChatGPT分析教师讲课的文本并建立知识元和语义框架的模型可以帮助你理解教师的教学内容以及课程结构。以下是一些步骤和方法,可帮助你进行这种分析:数据收集:收集教师讲课的文本或音频记录,这些记录可以是课堂讲座、教材、学生笔记或

什么是IoT数字孪生?

数字孪生是资产或系统的实时虚拟模型,它使用来自连接的物联网传感器的数据来创建数字表示。数字孪生允许您从任何地方实时监控设备、资产或流程。数字孪生用于多种目的,例如分析性能、监控问题或在实施之前运行测试。从物联网数字孪生中获得的见解使用户能够快速做出反应,以提高运营效率、生产质量、客户满意度等。基于NSDT场景编辑器搭建

docker总结

Docker实用篇0.学习目标1.初识Docker1.1.什么是Docker微服务虽然具备各种各样的优势,但服务的拆分通用给部署带来了很大的麻烦。分布式系统中,依赖的组件非常多,不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署,环境不一定一致,会遇到各种问题1.1.1.应用部署的环境问题大型项目组件较多

CLR via C#(三)垃圾回收

一、资源生命周期每个程序运行都需要各种资源,如文件、内存缓冲区、数据库等。要使用这些资源,就必须为代表资源的类型分配内存。访问一个资源所需的步骤如下:调用IL指令newobj,为代表资源的类型分配内存(在C#中一般用new操作符完成)初始化内存,设置资源的初始状态并使资源可用访问类型成员来使用资源摧毁资源状态以进行清理

多线程的学习第二篇

多线程线程是为了解决并发编程引入的机制.线程相比于进程来说,更轻量~~更轻量的体现:创建线程比创建进程,开销更小销毁线程比销毁进程,开销更小调度线程比调度进程,开销更小进程是包含线程的.同一个进程里的若干线程之间,共享着内存资源和文件描述符表每个线程被独立调度执行.每个线程都有自己的状态/优先级/上下文/记账信息进程是

Apache Tomcat

简介简而言之,Tomcat是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器。ApacheTomcatTomcat是Apache软件基金会(ApacheSoftwareFoundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。由于有了Sun的参与和支

Responder

环境准备操作系统:KaliLinux工具:responder,john,evil-winrmPS:输入以下命令解决靶场环境无法打开问题#echo"<靶机IP>unika.htb">>/etc/hostsresponder工具[Kali官网]手册地址:https://www.kali.org/tools/responde

热文推荐