无人机 PX4 飞控 | ROS应用层开发:基础代码框架构建

news2024/9/23 3:26:46

无人机 PX4 飞控 | ROS应用层开发:基础代码框架构建

  • 基础代码框架构建
    • 文件建立
    • 代码基本构建
    • 测试

基础代码框架构建

本篇博客拟在构建一个 无人机 PX4 飞控 ROS应用层开发 的 基础代码框架。

其中包含了基础类文件、类头文件、main主函数文件,及其编译所需的CMakeLists.txt、package.xml

在main文件中完成了时间片处理,并实例化了类,通过终端打印信息完成测试。

这个代码框架不仅限于该软件开发,还可用于其它项目。后期将在这个框架基础上实现各功能测试。

文件建立

在一个ROS的工作空间的src中,新建如下的文件结构。文件是空的没关系,后再写入内容。
也可以同ROS的指令,新建一个功能包
在这里插入图片描述
一个功能包的文件夹名称为mavros_function_test

包含src文件夹、include文件夹、CMakeLists.txt文件、package.xml文件

src文件夹中包含main.cpp文件用来生成执行文件;class.cpp文件用来实现类的功能

include文件夹中包含mavros_function_test文件夹,里面包含文件class.hpp文件用来定义类

代码基本构建

main.cpp 中加入下面代码 主要是基本的时间片管理 ,方便后期不同频率执行任务

#include <ros/ros.h>
#include "mavros_function_test/class.hpp"
#include <stdio.h>

 
#define LOOP_RATE 100

int main(int argc, char **argv)
{
  //Initiate ROS
  ros::init(argc, argv, "Mavros_Fuction_Test_Node");
  ros::NodeHandle nh;

  std::cout<<"Mavros Fuction Test Node Start !!!"<<std::endl;
 
  bool flag_1_Hz,flag_5_Hz,flag_10_Hz,flag_50_Hz;
  uint16_t time_manger = 0;

  MavrosFuctionTest mavros_function_test;

  ros::Rate loop_rate(LOOP_RATE);

  while (ros::ok())
  {
    // 时间片处理
    {
        time_manger++;
        if(time_manger>=LOOP_RATE)
        {
        time_manger = 0;
        flag_1_Hz = true;
        }

        if(time_manger%(LOOP_RATE/5)==0)
        {
        flag_5_Hz = true;
        }
        
        if(time_manger%(LOOP_RATE/10)==0)
        {
        flag_10_Hz = true;
        }
        
        if(time_manger%(LOOP_RATE/50)==0)
        {
        flag_50_Hz = true;
        }
    }


    if(flag_1_Hz)
    {
      flag_1_Hz = false;

    }


    if(flag_5_Hz)
    {
      flag_5_Hz = false;

    }



    if(flag_10_Hz)
    {
      flag_10_Hz = false;


    }



    if(flag_50_Hz)
    {
      flag_50_Hz = false;


    }



    ros::spinOnce();

    loop_rate.sleep();
  }



  return 0;

}

class.cpp 文件中加入如下代码 主要就是构造函数的实现,里面加入打印内容,来进行测试

#include "mavros_function_test/class.hpp"



MavrosFuctionTest::MavrosFuctionTest() //构造函数
{

    std::cout<<"MavrosFuctionTest Init Done "<<std::endl;

}

class.hpp 加入下面代码,定义了一个最基本的类

#ifndef CLASS_H
#define CLASS_H


#include <math.h>
#include <stdio.h>

#include <ros/ros.h>


class MavrosFuctionTest //类名  
{
public:
    MavrosFuctionTest(); //构造函数

private:

    ros::NodeHandle nh_;

};//End of class  MavrosFuctionTest

#endif

CMakeLists.txt文件加入下面代码,主要是文件的编译

cmake_minimum_required(VERSION 3.0.2)
project(Mavros_Fuction_Test)
# add_compile_options(-std=c++11)
find_package(catkin REQUIRED COMPONENTS
  geometry_msgs
  mavros_msgs
  roscpp
  std_msgs
)
catkin_package(
)
include_directories(
 include
  ${catkin_INCLUDE_DIRS}
)
add_library(Mavros_Fuction_Test_Class src/class.cpp )
target_link_libraries(Mavros_Fuction_Test_Class ${catkin_LIBRARIES} )
add_executable(Mavros_Fuction_Test_Node src/main.cpp)
target_link_libraries( Mavros_Fuction_Test_Node Mavros_Fuction_Test_Class ${catkin_LIBRARIES} )

package.xml 加入下面代码

<?xml version="1.0"?>
<package format="2">
  <name>Mavros_Fuction_Test</name>
  <version>0.0.0</version>
  <description>The Mavros_Fuction_Test package</description>
  <maintainer email="jk-jone@todo.todo">jk-jone</maintainer>
  <license>TODO</license>
  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>geometry_msgs</build_depend>
  <build_depend>mavros_msgs</build_depend>
  <build_depend>roscpp</build_depend>
  <build_depend>std_msgs</build_depend>
  <build_export_depend>geometry_msgs</build_export_depend>
  <build_export_depend>mavros_msgs</build_export_depend>
  <build_export_depend>roscpp</build_export_depend>
  <build_export_depend>std_msgs</build_export_depend>
  <exec_depend>geometry_msgs</exec_depend>
  <exec_depend>mavros_msgs</exec_depend>
  <exec_depend>roscpp</exec_depend>
  <exec_depend>std_msgs</exec_depend>
  <export>
  </export>
</package>

测试

在工作空间中进行编译

catkin_make

在这里插入图片描述
通过后,在一个终端启动ros

roscore

在节点的工作空间下面进行source

source devel/setup.bash

启动节点

rosrun Mavros_Fuction_Test Mavros_Fuction_Test_Node

终端出现
在这里插入图片描述
测试通过

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2090765.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构-c/c++实现栈(详解,栈容量可以动态增长)

一.栈的基本介绍 栈是一种只能够在一端进行插入和删除的顺序表。如下图 空栈&#xff1a;表示不含任何元素的栈 栈顶&#xff1a;表示允许进行插入和删除元素的一端 栈底&#xff1a;表示不允许进行插入和删除元素的一端 即栈是一种后进先出的线性表数据结构 二.栈的常见操…

Redis高级---面试总结之内存过期策略及其淘汰策略

目前已更新系列&#xff1a; 当前&#xff1a;Redis高级---面试总结之内存过期策略及其淘汰策略 并发编程之----线程池ThreadPoolExecutor,Excutors的使用及其工作原理 Redis高级----主从、哨兵、分片、脑裂原理-CSDN博客 计算机网络--面试知识总结一 计算机网络-----面试知…

【深度学习】yolov8的微调

yolov8的集成度太高了&#xff0c;除了config的哪些参数以外&#xff0c;需要更精细的微调。 比如这里&#xff1a; https://github.com/ultralytics/ultralytics/blob/main/ultralytics/utils/tuner.py 应用场景&#xff0c;交通标志的向左转&#xff0c;向右转之类的&#x…

Golang | Leetcode Golang题解之第384题打乱数组

题目&#xff1a; 题解&#xff1a; type Solution struct {nums, original []int }func Constructor(nums []int) Solution {return Solution{nums, append([]int(nil), nums...)} }func (s *Solution) Reset() []int {copy(s.nums, s.original)return s.nums }func (s *Solu…

STM32G474之HAL_Delay()会导致死机的原因

使用HAL库需要HAL_Delay()函数支持&#xff0c;离开这个函数&#xff0c;和这个函数有关的函数就无法调用了。遇到这个问题&#xff0c;我们肯定会否定HAL库&#xff0c;也确实它是有点差&#xff0c;但也有好的一面。 为什么HAL库初始化了SysTick定时器&#xff0c;也使能了相…

书生大模型实战营(1)——InterStudio基础知识+Vscode SSH连接远程服务器+Linux基础指令

参加书生.浦江大模型实战训练营&#xff0c;学习大模型知识和微调技术&#xff0c;所有课程免费&#xff0c;通过闯关的形式学习&#xff0c;也比较有趣。一起来了解LLM的世界。邀请链接 产品简介 InternStudio 是大模型时代下的云端算力平台。基于 InternLM 组织下的诸多算法…

Android Handler消息机制完全解析(二)

欢迎转载&#xff0c;转载请注明出处&#xff1a;https://blog.csdn.net/dmk877/article/details/141690289 在阅读本篇博客之前建议先阅读此篇 Android Handler消息机制完全解析(一) 在看Looper源码之前必须要理解ThreadLocal&#xff0c;ThreadLocal在Handler消息机制中起到…

信息安全--(五)物理与环境安全技术(二)机房安全分析与防护

在使用本博客提供的学习笔记及相关内容时&#xff0c;请注意以下免责声明&#xff1a;信息准确性&#xff1a;本博客的内容是基于作者的个人理解和经验&#xff0c;尽力确保信息的准确性和时效性&#xff0c;但不保证所有信息都完全正确或最新。非专业建议&#xff1a;博客中的…

FlowUs 小程序:开启高效之旅,订阅内容超精彩

一、丰富多样的订阅选择 FlowUs 小程序提供了极为丰富的订阅内容。无论你是对知识管理、项目管理感兴趣&#xff0c;还是专注于创意写作、时间规划&#xff0c;都能在这里找到适合自己的订阅选项。从专业的行业资讯到实用的技巧指南&#xff0c;从激发灵感的创意案例到深入的学…

业务解耦-Spring事件监听的三种实现方式

实现ApplicationListener 步骤如下&#xff1a; 1.写Event类&#xff0c;需要继承Spring的ApplicationEvent类 2.写监听类&#xff0c;需要实现Spring的ApplicationListener接口&#xff0c;加上Component注解 3.监听类实现onApplicationEvent方法 4.通过ApplicationContext.p…

开放大世界的全局寻路

开放大世界的寻路一直是很困扰我的一个点&#xff0c;地图大、还是动态可变的&#xff0c;所以寻路会有很多要求。就我们项目来讲&#xff0c;有这几个要求&#xff1a; 能满足极大范围的地图&#xff1b; 地图寻路数据能实时构建&#xff0c;且重建代价很小&#xff1b; 寻路的…

地质灾害监测预警系统的作用

在地球的广阔舞台上&#xff0c;自然灾害如同不可预测的演员&#xff0c;时常上演着惊心动魄的剧目。地震的震撼、滑坡的肆虐、泥石流的咆哮&#xff0c;这些地质灾害不仅给人类生命财产带来巨大威胁&#xff0c;也考验着社会的防灾减灾能力。为了应对这一挑战&#xff0c;地质…

【Linux】在 bash shell 环境下,当一命令正在执行时,按下 control-Z 会?

目录 题目分析答案 题目 分析 ctrl-c&#xff1a; 发送 SIGINT 信号给前台进程组中的所有进程。常用于终止正在运行的程序&#xff1b;ctrl-z&#xff1a; 发送 SIGTSTP信号给前台进程组中的所有进程&#xff0c;常用于挂起一个进程&#xff1b;ctrl-d&#xff1a; 不是发送信…

乐城堡 JoyCastle Unity岗位笔试题

1)实现 move(GameObjct gameObject, Vector3 begin, Vector3 end, float time, bool pingpong){ } 使 gameObject 在 time 秒内&#xff0c;从 begin 移动到 end&#xff0c;若 pingpong 为 true&#xff0c;则在结束时 使 gameObject 在 time 秒内从 end 移动到 begin&#xf…

机器学习中的增量学习(Incremental Learning,IL)策略是什么?

机器学习中的增量学习&#xff08;Incremental Learning&#xff0c;IL&#xff09;策略是什么&#xff1f; 在当今快速发展的数据驱动世界中&#xff0c;传统的静态机器学习模型逐渐显露出局限性。随着数据量的增长和分布的变化&#xff0c;模型需要不断更新&#xff0c;以保…

opc da 服务器数据 转IEC61850项目案例

目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 应用条件 2 4 查看OPC DA服务器的相关参数 2 5 配置网关采集opc da数据 4 6 用IEC61850协议转发数据 6 7 网关使用多个逻辑设备和逻辑节点的方法 9 8 在服务器上运行仰科OPC DA采集软件 10 9 案例总结 12 1 案例说明 在OPC DA服务…

使用 Vue3 Element Plus 实现el-table中的特定单元格编辑,下拉选择等

效果预览 完整代码(后面有解析) <template><div style="display: flex;align-items: center;justify-co

磁性齿轮箱市场报告:前三大厂商占有大约79.0%的市场份额

磁性齿轮箱是一种用于扭矩和速度转换的非接触式机构。它们无磨损、无摩擦、无疲劳。它们不需要润滑剂&#xff0c;并且可以针对其他机械特性&#xff08;如刚度或阻尼&#xff09;进行定制。 一、全球磁性齿轮箱行业现状与洞察 据 QYResearch 调研团队最新发布的“全球磁性齿轮…

成都高温限电:当电动汽车「无电可充」

8月末的成都&#xff0c;因为高温限电了。 近几日&#xff0c;成都市气象台连续发布了高温红色预警信号。据新华社报道&#xff0c;8月21日&#xff0c;四川电网用电负荷两次创下历史新高&#xff0c;最高达6797万千瓦&#xff0c;较去年最大用电负荷增长近13%&#xff0c;电力…

Golang | Leetcode Golang题解之第385题迷你语法分析器

题目&#xff1a; 题解&#xff1a; func deserialize(s string) *NestedInteger {index : 0var dfs func() *NestedIntegerdfs func() *NestedInteger {ni : &NestedInteger{}if s[index] [ {indexfor s[index] ! ] {ni.Add(*dfs())if s[index] , {index}}indexreturn…