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

无人机 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 中加入下面代码 主要是基本的时间片管理 ,方便后期不同频率执行任务

c 复制代码
#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 文件中加入如下代码 主要就是构造函数的实现,里面加入打印内容,来进行测试

c 复制代码
#include "mavros_function_test/class.hpp"



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

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

}

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

c 复制代码
#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文件加入下面代码,主要是文件的编译

c 复制代码
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 加入下面代码

c 复制代码
<?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>

测试

在工作空间中进行编译

c 复制代码
catkin_make

通过后,在一个终端启动ros

c 复制代码
roscore

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

c 复制代码
source devel/setup.bash

启动节点

c 复制代码
rosrun Mavros_Fuction_Test Mavros_Fuction_Test_Node

终端出现

测试通过

相关推荐
IT猿手4 小时前
基于控制障碍函数的多无人机编队动态避障控制方法研究,MATLAB代码
开发语言·matlab·无人机·openclaw·多无人机动态避障路径规划·无人机编队
波特率1152009 小时前
C++当中is-a(继承)与has-a(成员对象)的辨析与使用指南(包含实际工程当中的使用示例)
c++·ros·串口通信
IT猿手12 小时前
基于 ZOH 离散化与增量 PID 的四旋翼无人机轨迹跟踪控制研究,MATLAB代码
开发语言·算法·matlab·无人机·动态路径规划·openclaw
IT猿手12 小时前
基于控制障碍函数(Control Barrier Function, CBF)的无人机编队三维动态避障路径规划,MATLAB代码
开发语言·matlab·无人机·动态路径规划·无人机编队
IT猿手12 小时前
基于 CBF 的多无人机编队动态避障路径规划研究,无人机及障碍物数量可以自定义修改,MATLAB代码
开发语言·matlab·无人机·动态路径规划
IT猿手14 小时前
基于强化学习Q-learning算法的无人机三维路径规划算法原理与实现,MATLAB代码
算法·matlab·无人机·路径规划·动态路径规划
GIS数据转换器17 小时前
洪水时空大数据分析与评估系统
大数据·人工智能·机器学习·数据挖掘·数据分析·无人机·宠物
LONGZETECH18 小时前
实测职业教育无人机仿真教学软件:架构、功能与落地全解析
人工智能·架构·无人机·无人机仿真教学软件·无人机教学软件·无人机仿真软件
佳木逢钺19 小时前
ROS Noetic 中自定义编译和替换 cv_bridge 的完整指南
人工智能·bash·ros
IT猿手19 小时前
基于动态三维环境下的Q-Learning算法无人机自主避障路径规划研究,MATLAB代码
算法·matlab·无人机·动态路径规划·多无人机动态避障路径规划