通过MAVROS控制仿真无人机

2023-05-16

首先,在目录中建立工作区,并进行初始化操作

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws
catkin init
wstool init src
rosinstall_generator --rosdistro kinetic mavlink | tee /tmp/mavros.rosinstall
rosinstall_generator --upstream mavros | tee -a /tmp/mavros.rosinstall
wstool merge -t src /tmp/mavros.rosinstall
wstool update -t src
rosdep install --from-paths src --ignore-src -y
wget https://raw.githubusercontent.com/mavlink/mavros/master/mavros/scripts/install_geographiclib_datasets.sh
sudo chmod 777 install_geographiclib_datasets.sh
sudo ./install_geographiclib_datasets.sh
catkin build
source ~/catkin_ws/devel/setup.bash

然后,在catkin_ws/src目录中运行如下指令

catkin_create_pkg offboard_pkg roscpp std_msgs geometry_msgs mavros_msgs

在~/catkin_ws/src/offboard_pkg/src/目录中新建一个文件offboard_node.cpp,写入如下代码

#include <ros/ros.h>
#include <geometry_msgs/PoseStamped.h>
#include <mavros_msgs/CommandBool.h>
#include <mavros_msgs/SetMode.h>
#include <mavros_msgs/State.h>

int count;
int flag=1;
mavros_msgs::State current_state;
void state_cb(const mavros_msgs::State::ConstPtr& msg){
    current_state = *msg;
}

int main(int argc, char **argv)
{
    ros::init(argc, argv, "offboard");
    ros::NodeHandle nh;

    ros::Subscriber state_sub = nh.subscribe<mavros_msgs::State>
            ("mavros/state", 10, state_cb);
    ros::Publisher local_pos_pub = nh.advertise<geometry_msgs::PoseStamped>
            ("mavros/setpoint_position/local", 10);
    ros::ServiceClient arming_client = nh.serviceClient<mavros_msgs::CommandBool>
            ("mavros/cmd/arming");
    ros::ServiceClient set_mode_client = nh.serviceClient<mavros_msgs::SetMode>
            ("mavros/set_mode");

    //the setpoint publishing rate MUST be faster than 2Hz
    ros::Rate rate(8.0);

    // wait for FCU connection
    while(ros::ok() && !current_state.connected){
        ros::spinOnce();
        rate.sleep();
    }
    geometry_msgs::PoseStamped pose;
    pose.pose.position.x = 0;
    pose.pose.position.y = 0;
    pose.pose.position.z = 3;
   
    //send a few setpoints before starting
    for(int i = 100; ros::ok() && i > 0; --i){
        local_pos_pub.publish(pose);
        ros::spinOnce();
        rate.sleep();
    }

    mavros_msgs::SetMode offb_set_mode;
    offb_set_mode.request.custom_mode = "OFFBOARD";

    mavros_msgs::CommandBool arm_cmd;
    arm_cmd.request.value = true;

    ros::Time last_request = ros::Time::now();
    
    while(ros::ok())
   {
		
	if( current_state.mode != "OFFBOARD" &&
            (ros::Time::now() - last_request > ros::Duration(5.0))){
            if( set_mode_client.call(offb_set_mode) &&
                offb_set_mode.response.mode_sent){
                ROS_INFO("Offboard enabled");
            }
            last_request = ros::Time::now();
        } else {
            if( !current_state.armed &&
                (ros::Time::now() - last_request > ros::Duration(5.0))){
                if( arming_client.call(arm_cmd) &&
                    arm_cmd.response.success){
                    ROS_INFO("Vehicle armed");
                }
                last_request = ros::Time::now();
            }
        }
		
            if((flag == 1)  && (ros::Time::now() - last_request > ros::Duration(5.0)))
		{ 
			ROS_INFO("position1(0 , 0,  5)");
                	pose.pose.position.x = 0;
    			pose.pose.position.y = 0;
    			pose.pose.position.z = 5;
			last_request = ros::Time::now();
                        flag=2;

                }

		if((flag ==2) && (ros::Time::now() - last_request > ros::Duration(5.0)))
		{
			ROS_INFO("position2(5 , 0,  5)");
                	pose.pose.position.x = 5.0;
    			pose.pose.position.y = 0.0;
    			pose.pose.position.z = 5;
			last_request = ros::Time::now();
			flag=3;
                }
                       
		 if((flag ==3) && (ros::Time::now() - last_request > ros::Duration(5.0)))
                {
                        ROS_INFO("position3(5 , 5,  5)");
                        pose.pose.position.x = 5.0;
                        pose.pose.position.y = 5.0;
                        pose.pose.position.z = 5;
                        last_request = ros::Time::now();
			flag=4;
                }

		 if((flag ==4) && (ros::Time::now() - last_request > ros::Duration(5.0)))
                {
                        ROS_INFO("position4(0 , 5,  5)");
                        pose.pose.position.x = 0;
                        pose.pose.position.y = 5.0;
                        pose.pose.position.z = 5;
                        last_request = ros::Time::now();
			flag=5;
                }


		 if((flag ==5) && (ros::Time::now() - last_request > ros::Duration(5.0)))
                {
                        ROS_INFO("position5(0 ,0,  5)");
                        pose.pose.position.x = 0;
                        pose.pose.position.y = 0;
                        pose.pose.position.z = 5;
                        last_request = ros::Time::now();
			flag=1;
                }
        local_pos_pub.publish(pose);
        ros::spinOnce();
        rate.sleep();
    }

    return 0;
}

该代码的作用为让无人机飞至5米高度,然后循环按照正方形轨迹飞行

然后打开目录~/catkin_ws/src/offboard_pkg/下的CMakeLists.txt添加下面的两行:

add_executable(offboard_node src/offboard_node.cpp)
target_link_libraries(offboard_node ${catkin_LIBRARIES})

然后到目录~/catkin_ws下,运行命令

catkin build

然后,使终端进入PX4的安装目录下,运行命令

make px4_sitl gazebo_iris

即可进入gazebo仿真界面

接着,打开QGC地面站,并运行如下命令连接Mavros和PX4

roslaunch mavros px4.launch fcu_url:="udp://:14540@127.0.0.1:14557"

执行刚才的C++文件

source ~/catkin_ws/devel/setup.bash
rosrun offboard_pkg offboard_node

在gazebo中观察仿真结果即可。

 

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

通过MAVROS控制仿真无人机 的相关文章

  • mavros操作飞机时方向位置改为机体坐标系下指令(转载)

    转载自 xff1a mavros操作飞机时方向位置改为机体坐标系下指令 渡之的博客 CSDN博客 前面试了很多 xff0c 看官网里的说明 用 mavros setpoint raw local 34 里的frame id改为 34 bas
  • MAVROS机外(offboard)控制例程

    PX4与ROS各部分的关系 Simulator仿真器 xff08 Gazebo xff09 xff1a 模拟真实飞行 xff0c 即模拟计算出真实飞行时的传感器状态 xff0c 包括GPS xff0c IMU xff08 惯性测量单元 xf
  • 树莓派通过MAVROS与Pixhawk/PX4通信

    1 安装ROS 2 安装MAVROS 3 配置Pixhawk 通常TELEM 2用来和机载计算机连接 xff0c 连接方式为串口转USB 通信协议为MAVLink xff0c 因此需要先使能TELM2上的MAVLink输出 v1 9 0及以
  • 二、MAVROS的安装(PX4:v1.10.0 \ ROS:kinetic)

    mavros 功能包提供了 一台能够运行ros的机载电脑 支持MAVLINK协议的飞控和支持MAVLINK的地面站这三者之间的通讯功能 MAVROS 是 ROS 与 MAVLink 协议之间的 有 34 官方 34 支持的ROS功能包 它当
  • px4连接不了mavros的原因

    本人多次试过机载重装系统后初次安装mavros 出现mavros连接不上的问题 一 USB接口电压不够 我之前遇到过的一种就是当px4通过USB线接入机载 xff0c 启动mavros时 xff0c 一直连接不上 xff0c 而且px4上常
  • 常用MAVROS话题和服务

    https zhuanlan zhihu com p 364872655 一 常用接收的话题 1 1 系统状态 消息名称 xff1a mavros state 类型 xff1a mavros msgs State 头文件 xff1a mav
  • 步骤四:T265和Mavros通讯

    阿木的volans项目连接t265与px4是在2022年暑假实验的 但是随后在九月初再试实验时 由于一些暂时不知明的原因 无法联机 于是 我们改用了官网的连接方法 下面附上官网链接 T265 Intel Realsense Tracking
  • PX4 vision_to_mavros定位

    PX4官方给出以下做法从而使用intel realsense t265深度相机作为视觉估计的硬件选择 在这里我使用pixhawk 4和realsense t265以及Jetson TX2机载计算机以及benewake tfmini激光测高模
  • mavros 使用经验记录

    我用的飞控硬件板是pixhawk xff0c 用missionplanner刷的fight stack是apm的最新版本3 4 amp对mavros支持不是特别好 xff0c 如果合适还是用px4的flight stack 比较好 xff0
  • 提高mavros中IMU话题的发布频率

    提高mavros中IMU话题的发布频率 提高波特率提高方法命令行方式原始IMU数据飞控计算过后的IMU数据总结 更改启动文件 在上位机上很多时候都需要用到无人机的IMU信息 xff0c 我用的飞控硬件是Pixhawk 4 xff0c 感觉I
  • MAVROS二次开发(二)(三)添加自定义消息

    MAVROS二次开发 二 MAVROS消息添加 1 自定义rostopic消息 路径 xff1a catkin ws src mavros mavros msgs msg 自定义消息文件名称 xff1a CrawlControlStatus
  • MAVROS二次开发(四)添加消息处理插件

    MAVROS二次开发 四 添加消息处理插件 mavros插件所在路径 xff1a catkin ws src mavros mavros src plugins 1 自定义消息处理插件的编写 参考代码 xff1a catkin ws src
  • MAVROS二次开发(五)进行测试

    MAVROS二次开发 五 进行测试 1 测试环境 PX4 xff1a v1 10 1 xff08 含自定义mavlink消息收发 xff09 ROS xff1a KineticUbuntu xff1a 16 04LTSQGC xff1a S
  • ubuntu20 安装px4、mavros、QGroundControl

    一 安装PX4 jjm2是我的主文件夹名 xff0c 可以根据自己的主文件夹名修改 下载PX4 git clone https github com PX4 PX4 Autopilot git recursive 由于网速原因 xff0c
  • MAVROS(1)offboard模式(手动和roslaunch启动)

    官方教程 xff1a https docs px4 io master en ros mavros offboard html 1 编写功能包 参考 xff1a https blog csdn net weixin 44917390 art
  • APM-SITL Gazebo MAVROS 仿真

    1 配置APM SITL环境 1 下载安装Ardupilot 参考链接 xff1a 官方教程 注意 xff1a 文件install prereqs ubuntu sh路径在 ardupilot Tools environment insta
  • mavros_extras 这是一个巨大的发现 vision_position

    这是一个巨大的发现 http wiki ros org mavros MAVROS wiki的最后一段文字我细读了一下发现了一个东西 96 vision position 96 这不正是我哦想做的视觉SLAM输出位置信息么 xff01 xf
  • mavros_msgs的type_mask用法

    这几天在看自主无人机的一些代码 xff0c 如下 xff1a mavros msgs PositionTarget PositionSetpoint PositionSetpoint type mask 61 0b100111000000
  • Jetson Xavier NX安装Mavros

    Px4飞控通过USB线连接Jetson Xavier NX xff0c 如果需要进行软连接 xff0c 即通讯 xff0c 需要下载Mavros功能包 xff0c 并通过启动命令进行连接 安装Mavros sudo apt install
  • 步骤三:PX4,Mavros的下载安装及代码测试

    1 安装Mavros sudo apt install ros melodic mavros ros melodic mavros extras 2 安装Mavros相关的 geographiclib dataset 此处已经加了ghpro

随机推荐

  • Ubuntu 安装ROS (解决rosdep init 失败)

    当前网络上有很多的ROS安装教程 xff0c 但是由于国内的网络问题 xff0c 所以在教程进行到rosdep init时 xff0c 会出现问题 xff0c 所以这篇博客主要解决这个问题 xff0c 以下为教程全部内容 xff1a 引用教
  • Ubuntu20.04部署编译LVI-SAM

    该动图来自LVI SAM开源地址 xff08 https github com TixiaoShan LVI SAM xff09 1 写在开头 1 1 为何诞生此文 近期在学习SLAM相关知识 xff0c 拜读了此篇经典论文LVI SAM
  • QT中的强制类型转换

    当使用C语言那种形式的强制转换 xff0c 发现QT会给出一个使用旧的方式的警告 所以在QT中使用如下类型转换 xff0c 就不会有警告 xff0c 而且这种方式的强制转换更加的安全 xff08 1 xff09 dynamic cast l
  • QT之QCharts的使用(绘制折线图)

    一 画折线图 1 修改 pro文件 在里面添加QT 43 61 charts 2 MyWidget h程序 ifndef MYWIDGET H define MYWIDGET H include lt QWidget gt 添加以下三个头文
  • 恢复经过软件处理过的U盘导致的U盘空间显示不正确等问题

    1 win 43 R xff0c 打开运行 xff0c 输入CMD xff0c 点击确定 2 在命令行中输入DISKPART并回车 xff0c 会跳出一个窗口 xff0c 这就进入了diskpart 3 在跳出的窗口diskpart 中输入
  • 关于STM32 CAN 发送失败问题解释

    首先解释一下CAN几个配置的功能 xff1a 1 CAN InitStruct CAN TTCM 61 DISABLE 这个只在某些CAN标准中使用 xff0c 就设置为DISABLE 2 CAN InitStruct CAN ABOM 6
  • VS2022调试vector无法显示详细信息

    使用vs2022调试vector发现这样的现象 xff1a 为了显示vector大小以及详细的元素 xff0c 需要编写natvis文件 span class token operator lt span span class token
  • STM32H7 PVD断电的使用

    1 遇到的问题 我使用的是STM32H747 xff0c 在初始化后发现断电后并没有进入中断 最后查找到因为STM32H747是双核CPU xff0c 在HAL库源码中 xff0c 有双核的宏定义将一些配置给屏蔽了 xff0c 因为我只用到
  • STM32H7A3 ADC+DMA使用问题

    问题1 xff1a DMA采用半字传输16位ADC值 xff0c 用于存储ADC数据的数组一定是采集数的两倍 xff0c 否则会产生ADC溢出的错误中断HAL ADC ErrorCallback xff0c 从而无法进入ADC采集完成中断H
  • STM32使用RTOS BootLoader跳转app进入异常中断问题

    一 问题描述 在boot中不使用RTOS xff0c 跳转到APP中 xff0c APP可以正常运行 但是boot中使用RTOS跳转到APP中 xff0c 程序配置完时钟后就会进入MemManage Handler错误中断 二 解决方法 1
  • STM32H7 SPI+DMA只发送一次,然后一直报busy的问题

    网上看了很多讲SPI 43 DMA问题的帖子 xff0c 有说必须发送DMA和接收DMA必须同时配置的 xff0c 有的说DMA发送前需要手动调用HAL SPI Abort函数的 首先我尝试的同时配置发送DMA和接收DMA xff0c 还是
  • STM32 EventRecorder printf不打印输出在调试窗口的问题解决

    一 添加event recorder到工程中 也可以自己移植源码到工程里面 xff0c 添加好后 xff0c 工程中会多出几个文件 xff0c 如下图所示 xff0c 我这是自己移植的源码到工程中的 xff0c 没有使用keil添加 二 初
  • linux只W25Q256驱动,使用m25p80,支持w25q系列nor flash

    1 内核编译选项增加 1 xff09 Device Drivers Memory Technology Device MTD support gt 2 Device Drivers Memory Technology Device MTD
  • STM32f103时钟系统简介

    主要是讲解怎么看懂这个图 一 内置RC振荡器 xff08 HSI RC xff09 频率是约为8MHz xff0c 因为其频率不是很稳定 其可作为系统时钟的一个选项 二 晶振振荡器 xff08 HSE OSC xff09 从图中可以看到其是
  • Keil软件仿真

    首先就是配置上面图中的debug xff0c 选择软件仿真 然后是选择芯片 xff0c 根据自己的硬件芯片选择 8号标注是进入该图中的debyg模式 1号标注 xff1a 这个是一个RST按钮 xff0c 和硬件一样是复位的功能 2号标注
  • STM32F103系列NVIC中断优先级分组讲解

    一 简介 CM3内核支持256个中断 xff0c 16个内核中断 xff0c 240个外部中断 xff0c 并且拥有256级的可编程中断设置 但是STM32只用到了CM3内核的一部分 xff0c STM32有84个中断 xff0c 包括16
  • BOM详解

    1 BOM 什么是 Browser Object Model 专门操作浏览器窗口的API 没有标准 DHTML对象模型 window 2个角色 1 代替global作为全局作用域对象 所有全局函数和全局变量都是window的成员 2 封装所
  • ERROR: Could not install packages due to an OSError: [Errno 13] Permission denied问题解决

    Windows Anaconda python3 6 安装依赖包发生错误如下 pip install i https pypi tuna tsinghua edu cn simple r requirements txt user ERRO
  • docker的深入浅出--3.Dockerfile介绍及保留字指令的使用run、entrypoint、onbuild、add和copy关键字以及自定义镜像

    目录 一 Dockerfile介绍 1 centos镜像来理解Dockerfile 2 docker的创建流程 二 Dockerfile的保留字指令 1 自定义centos镜像 xff08 run保留字 xff09 history指令 2
  • 通过MAVROS控制仿真无人机

    首先 xff0c 在目录中建立工作区 xff0c 并进行初始化操作 mkdir p catkin ws src cd catkin ws catkin init wstool init src rosinstall generator ro