ROS四旋翼无人机快速上手指南(5):快速部署上层算法的操作与思路

2023-05-16

成就更好的自己

经过本系列上一篇文章关于PX4_command飞行控制功能包的分析,相信大家对于飞整个流程有个大概的了解,本章将在此基础上详细讲解一下应用级算法构建的思路与操作方法。

关于PX4_command飞行控制功能包的分析见链接:

https://blog.csdn.net/qq_36098477/article/details/115496830


目录

px4_command核心文件修改

px4_vel_controller.cpp

px4_pos_estimator.cpp

上层控制程序控制思路


px4_command核心文件修改

让我们详细看一下px4_vel_controller.cpp和px4_pos_estimator.cpp

px4_vel_controller.cpp

//相应的命令分别为 移动(惯性系ENU),移动(机体系),悬停,降落,上锁,紧急降落,待机

enum Command

{

    Move_ENU,

    Move_Body,

    Hold,

    Takeoff,

    Land,

    Arm,

    Disarm,

    Failsafe_land,

    Idle

};

上面枚举了command命令所支持的所有命令,具体使用方法如下:

Arm:通过解锁命令使得自驾仪状态由Disarm变为Arm,然后自驾仪进入Idle待机状态,四个电机怠速旋转;

Command_now.command = Arm;

command_pub.publish(Command_now);

Disarm:通过锁定命令使得自驾仪状态变为Disarm,然后自驾仪进入锁定状态,四个电机锁定;

Command_now.command = Disarm;

command_pub.publish(Command_now);

Takeoff:初始化所有起飞数据,将起飞地面点设为世界坐标系零点,起飞至一定高度并悬停,起飞高度由参数服务器中的fly_height决定,在文件Parameter_for_control.yaml中修改;

Command_now.command = Takeoff;

command_pub.publish(Command_now);

Land:使无人机降落,降落原理是当距离地面小于某个距离时发布命令使自驾仪锁定,即进入Disarm状态,电机锁转,降落距离在文件command_to_mavros.h中修改,修改后需要重新catkin_make;

Command_now.command = Land;

command_pub.publish(Command_now);

Hold:在某一位置悬停,悬停位置即当时无人机所处位置;

Command_now.command = Hold;

Command_now.sub_mode = 0x00;

command_pub.publish(Command_now);

Idle:电机怠速旋转模式,可以用来作为临时降落;

注:因为ldle怠速降落与land降落的区别,怠速降落只是使无人机失去推力,不会改变自驾仪锁定状态等其他属性,世界坐标系与无人机相对坐标不变,再次起飞时不需要解锁与take_off指令,直接使用Move_ENU或Move_Body即可起飞,相当于继续保留降落前的状态;但是land指令执行后直接使自驾仪锁定Disarm,再次起飞必须要重新Arm,然后使用take_off指令,但是这样会使世界坐标系重新定位,各种参数也会重置;因此在需要多次降落的任务中,可以考虑ldle怠速降落的方法。

Command_now.command = Idle;

command_pub.publish(Command_now);

Move_ENU和Move_Body:是无人机移动指令,这两模式的区别是,前者是在世界坐标系下移动,所给出的航点是参照世界坐标系原点的;后者是在机体系下移动,每条指令所给出的航点始终以自己为坐标系原点。此外,两种模式均有子模式,分别是按照速度控制模式与位置控制模式,使用时按照所需参数赋值即可。

Command_now.command = Move_ENU;     //机体系下移动

Command_now.comid = comid;

comid++;

Command_now.sub_mode = 2; // xy 速度控制模式 z 位置控制模式

Command_now.vel_sp[0] =  vel_sp_ENU[0];

Command_now.vel_sp[1] =  vel_sp_ENU[1];  //ENU frame

Command_now.pos_sp[2] =  0.5;  //航点高度

Command_now.yaw_sp = 0 ;

px4_vel_controller.cpp文件的任务就是对每一条命令进行处理的程序,想了解与MAVROS关系的可以从这里下手。

 

px4_pos_estimator.cpp

这个文件的内容跟数据融合有关,然而大多数都不要修改,只有一个地方可以根据实际情况修改,就是主要传感器数据的来源设置;

void pose_pub_timer_cb(const ros::TimerEvent& TE)

{

    //source -from cartographer

    if (pose_source == 0)  

    {

        pos_drone_laser[2] = pos_drone_fcu[2];

        vision.pose.position.x = pos_drone_laser[0];

        vision.pose.position.y = pos_drone_laser[1];

        vision.pose.position.z = pos_drone_laser[2];



        vision.pose.orientation.x = q_laser.x();

        vision.pose.orientation.y = q_laser.y();

        vision.pose.orientation.z = q_laser.z();

        vision.pose.orientation.w = q_laser.w();

        vision.header.stamp = TE.current_real;

    }

    //source -from t265

    if (pose_source == 1)

    {

        //pos_drone_t265[2] = pos_drone_fcu[2];

        vision.pose.position.x = pos_drone_t265[0];

        vision.pose.position.y = pos_drone_t265[1];

        vision.pose.position.z = pos_drone_t265[2];



        vision.pose.orientation.x = q_t265.x();

        vision.pose.orientation.y = q_t265.y();

        vision.pose.orientation.z = q_t265.z();

        vision.pose.orientation.w = q_t265.w();

        vision.header.stamp = TE.current_real;

    }

    //source -from uwb

    if (pose_source == 2)

    {

        pos_drone_uwb[2] = pos_drone_fcu[2];

        vision.pose.position.x = pos_drone_uwb[0];

        vision.pose.position.y = pos_drone_uwb[1];

        vision.pose.position.z = pos_drone_uwb[2];



        vision.pose.orientation.x = q_uwb.x();

        vision.pose.orientation.y = q_uwb.y();

        vision.pose.orientation.z = q_uwb.z();

        vision.pose.orientation.w = q_uwb.w();

        vision.header.stamp = TE.current_real;

    }

    ready_for_pub = true;

}

pose_source决定的是无人机位姿数据来源,0是激光雷达,1是T265相机,2是无人机自驾仪数据。因为本项目采用的是T265获取位姿,因此主要数据来源就采用了T265;如果在后期开发使用了其他位姿传感器,则可以再次修改主要数据来源。pose_source是ROS参数服务器中的一个参数,可以在px4_pos_estimator.launch文件中进行修改。

 

上层控制程序控制思路

分析一下如何调用px4_command命令控制飞机运动;

例如,运行input_point.sh脚本启动输入航点控制无人机飞行程序,C++源文件是src中的input_point.cpp;

//【订阅】无人机当前位置 坐标系 NED系

//ros::Subscriber position_sub = nh.subscribe<geometry_msgs::Pose>("/drone/pos", 100, pos_cb);

ros::Subscriber position_sub = nh.subscribe<geometry_msgs::PoseStamped>("/mavros/local_position/pose", 100, pos_cb);  //dyx

// 【发布】发送给position_control.cpp的命令

ros::Publisher command_pub = nh.advertise<px4_command::command>("/px4/command", 10);

//【订阅】Lidar数据

ros::Subscriber lidar_sub = nh.subscribe<sensor_msgs::LaserScan>("/scan", 1000, lidar_cb);//dyx

订阅无人机当前位姿带入算法,数据是由px4_pos_estimator节点发布到/mavros/local_position/pose话题上的;订阅激光雷达信息,判断周围环境和障碍物信息;发布控制指令到/px4/command话题上,由px4_vel_controller节点订阅接收并处理。

//输入1,继续,其他,退出程序

    cout << "Please check the parameter and setting,1 for go on, else for quit: "<<endl;

    cin >> check_flag;

    if(check_flag != 1) return -1;



    //check arm

    int Arm_flag;

    cout<<"Whether choose to Arm? 1 for Arm, 0 for quit"<<endl;

    cin >> Arm_flag;

    if(Arm_flag == 1)

    {

        Command_now.command = Arm;

        command_pub.publish(Command_now);

    }

    else return -1;



    //check takeoff

    int Take_off_flag;

    cout<<"Whether choose to Takeoff? 1 for Takeoff, 0 for quit"<<endl;

    cin >> Take_off_flag;

    if(Take_off_flag == 1)

    {

        Command_now.command = Takeoff;

        command_pub.publish(Command_now);

    }

else return -1;

经过起飞前检查,解锁,起飞后,飞机已经进入悬停模式了,并悬停在take_off指定的高度。

cout << "按右手系坐标输入航点坐标:x  y  z,坐标以空格隔开,最大4m" << endl;

            scanf("%f %f %f",&target_x,&target_y,&target_z);

            if(abs(target_x) <= 4.0 &&abs(target_y) <= 4.0 && target_z > 0 && target_z <= 3)

            {

                while(arrive_flag == false)

                {

                    ros::spinOnce();

                    collision_avoidance(target_x,target_y);

                    horizontal_distance = sqrt((pos_drone.pose.position.x - target_x) * (pos_drone.pose.position.x - target_x) + (pos_drone.pose.position.y - target_y) * (pos_drone.pose.position.y - target_y));

                    vertical_distance = abs(pos_drone.pose.position.z - target_z);

                    cout<<"horizontal_distance:  "<<horizontal_distance<<endl;

                    Command_now.command = Move_ENU;     //机体系下移动

                    Command_now.comid = comid;

                    comid++;

                    Command_now.sub_mode = 2; // xy 速度控制模式 z 位置控制模式

                    Command_now.vel_sp[0] =  vel_sp_ENU[0];

                    Command_now.vel_sp[1] =  vel_sp_ENU[1];  //ENU frame

                    Command_now.pos_sp[2] = target_z;

                    Command_now.yaw_sp = 0 ;

                    command_pub.publish(Command_now);

                    printf();

                    rate.sleep();

                    if(horizontal_distance < 0.03 && vertical_distance < 0.03)

                    {

                        arrive_flag = true;

                        for (int i=0; i<5; i++)

                        {

                            Command_now.command = Hold;

                            Command_now.sub_mode = 0x00;

                            command_pub.publish(Command_now);

                            rate.sleep();

                        }

                    }

                }

输入航点,collision_avoidance(target_x,target_y)函数根据激光雷达算出障碍物位置与距离进而计算水平移动速度与避障方案,最后得出x和y轴向的正交分解速度,z轴坐标给出直接使用,然后通过Move_ENU命令将算出的速度传给MAVROS,进而传给自驾仪控制电机;当3轴向位置达到预定位置后,使无人机悬停到当前位置,准备接受下一个航点指令。

 

同样道理,如果想要开发高级算法,思路也是使用/mavros/local_position/pose的无人机位姿数据带入算法,输入或计算出目标航点,然后将目标航点通过px4_command指令发布在/px4/command话题上控制飞行即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS四旋翼无人机快速上手指南(5):快速部署上层算法的操作与思路 的相关文章

随机推荐

  • 11.基于STM32C8T6的四旋翼无人机的飞控制作----PID调试方法

    四旋翼PID参数的几种调试方法 xff0c 自己起的名字 xff0c xff0c xff0c 1 单轴法 将飞机固定在一个长杆上 xff0c 杆的两头固定于两个桌子上 xff0c 飞机的x轴或y轴与杆平行 xff0c 使其只有绕轴旋转一个自
  • STM32内存结构介绍和FreeRTOS内存分配技巧

    概述 这是我第一次使用FreeRTOS构建STM32的项目 xff0c 踩了好些坑 xff0c 又发现了我缺乏对于操作系统的内存及其空间的分配的知识 xff0c 故写下文档记录学习成果 文章最后要解决的问题是 xff0c 如何恰当地分配Fr
  • 使用JetPack4.2为NVIDIA Xavier刷机

    1 准备 Host xff1a Ubuntu 16 04或18 04系统 xff0c 配备鼠标 键盘 显示器 xff0c 联网 Xavier xff1a 配备鼠标 键盘 显示器 HDMI转VGA接口 xff08 连接显示器和Xavier x
  • Java与设备(PLC)通信

    通信名词 上位机 指可以直接发出操控命令的计算机 xff0c 一般是PC host computer master computer upper computer 控制者和提供服务者是上位机 xff1b 工控机 工作站 触摸屏可作为上位机
  • DAMA学习笔记

    第1章 数据管理 1 1 引言 1 数据管理 xff1a 为了实现数据价值 xff0c 制定计划 制度并执行 监督 2 数据管理专业人员 xff1a 技术人员 xff08 数据库管理员 网络管理员 程序员 xff09 和业务人员 xff08
  • 2023 学习日志

    2023 01 03 mybatis源码学习 学习视频 xff1a https www bilibili com video BV1Tp4y1X7FM p 61 1 amp vd source 61 cc82a52a9b9b8b31eca3
  • EL表达式两个foreach嵌套循环

    集合List中加List泛型的泛型 List lt RiskEvaSuitQuestion gt riskEvaSuitQuestionList 61 riskEvaSuitQuestionService getQueList 100003
  • JQuery通过radio,select改变隐藏显示div

    1 xff09 select下拉框控制div的隐藏与显示 lt script gt function checkYear var selectValue 61 34 select name 61 39 periodType 39 34 va
  • 开科唯识笔试

    对于这次的笔试 xff0c 我只想说BiShi 几道编程题加一道SQL题 1 找出所有三位数中的水仙花数 public void getNarcissusNums int g 61 0 s 61 0 b 61 0 sum 61 0 for
  • JDBC批量插入

    最近项目中有用到JDBC技术 xff0c 存在大量数据要进行插入 xff0c 通过研究采用批量插入速度快的不是一点点 下面简单比较了一下普通插入与批量插入5W条数据的时间效率 常规插入 xff1a 耗时12952ms public stat
  • 面试经历---YY欢聚时代(2015年11月21日上午初试、25日下午复试)

    YY欢聚时代一年多前去面试过一次 xff0c 当时鄙视了 xff0c 在现在的公司呆了1年半了 xff0c 感觉做得很不爽 xff0c 而且薪资又不满意 xff0c 所以想找个新工作 xff0c 就想去YY面试 下面将两次YY面试的经历写出
  • exe应用程序无法启动,因为应用程序的并行配置不正确

    问题 xff1a exe应用程序无法启动 xff0c 因为应用程序的并行配置不正确 有关详细信息 xff0c 请参阅应用程序事件日志 xff0c 或使用命令行 sxstrace exe 工具 原因查找 xff1a 1 xff09 开始 所有
  • TortoiseSVN is locked in another working copy

    TortoiseSVN提交报错 TortoiseSVN is locked in another working copy 原因 xff1a 可能是因为打开了多个commit会话 xff0c 然后又去修改了提交文件的内容 xff0c 导致文
  • Java对接企业微信

    最近需要对接企业微信 xff0c 例如将风险测评结果推送给企业微信中对应的用户 xff0c 然后用户对结果进行查看与确认操作 xff0c 所以这里就涉及到两方面 xff1a 1 xff09 将外部系统内容推送到企业微信 xff1b 2 xf
  • 微众银行面试

    机缘巧合 xff0c 其实并没有换工作的想法 xff0c 却收到了微众的面试邀请 xff0c 就想着去看看当是增长见识吧 xff0c 因为已经好久没准备面试的事情了 xff0c 而且微众毕竟作为腾讯系的看起来好像也不错 说实话那边离地铁站是
  • #TP4056#--3.7V锂电池充放电电路(实践日志篇)

    成就更好的自己 本篇为小型电源的实践日志 xff0c 内附各种充电应用电路 xff0c 并开源TP4056应用电路AD的原理图和PCB xff1b 先放一点锂电池常识性的知识 xff1a 锂电池是一类由锂金属或锂合金为负极材料 使用非水电解
  • ROS四旋翼无人机快速上手指南(1):无人机系统硬件概述与指南简介

    成就更好的自己 ROS无人机快速上手指南旨在于让使用此无人机开发平台的比赛参赛人员 xff0c 算法设计人员 xff0c 无人机爱好者更加快速的了解底层控制运作原理 xff0c 从而缩短开发周期 xff0c 减少掉坑次数 xff0c 快速验
  • ROS四旋翼无人机快速上手指南(2):Ubuntu18.04与ROS系统

    成就更好的自己 目录 Jetson版Ubuntu以及ROS的安装 xff1a ROS特性及Nano开发问题 PX4与Gazebo仿真环境 ROS与MATMAB仿真 Jetson版Ubuntu以及ROS的安装 xff1a ROS机器人系统运行
  • ROS四旋翼无人机快速上手指南(4):阿木实验室PX4功能包飞行控制分析与讲解(重点章节)

    成就更好的自己 这一章详细讲解一下阿木实验室 AMOV 的开源项目px4 command功能包 xff0c 此功能包通过mavlink协议直接控制烧录px4固件的自驾仪 xff0c 还融合了来自各个传感器的位姿 xff0c 距离等信息 xf
  • ROS四旋翼无人机快速上手指南(5):快速部署上层算法的操作与思路

    成就更好的自己 经过本系列上一篇文章关于PX4 command飞行控制功能包的分析 xff0c 相信大家对于飞整个流程有个大概的了解 xff0c 本章将在此基础上详细讲解一下应用级算法构建的思路与操作方法 关于PX4 command飞行控制