无人机 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
终端出现
测试通过