无人机仿真—PX4编译,gazebo仿真及简单off board控制模式下无人机起飞

2023-05-16

无人机仿真—PX4编译,gazebo仿真及简单off board控制模式下无人机起飞

前言

  • 在上篇记录中,已经对整体的PX4仿真环境有了一定的了解,现如今就要开始对无人机进行起飞等仿真环境工作,在整体虚拟环境中如果程序能够安稳起飞降落,即可对无人机进行实飞操作。
  • 需要做的是,通过PX4官网提供的基本程序包,在ROS工作空间下新建程序包对其进行运行,再打开仿真环境即可

PX4编译

  • cd /Firmware  #进入PX4文件夹内
    make px4_sitl_default gazebo  # 编译固件并加载仿真环境
    
  • 如果想进行自动起飞,可运行以下命令

    • commander takeoff
      

利用ROS启动仿真环境(正式)

  • 老规矩先加载ROS,运行命令

    • roscore
      
      
  • roscore启动

    • 出现红色警告,说明ROS本地缓存大于1GB,可以忽视,如果需要清理可以使用

      • rosclean purge
        
  • 在PX4文件夹内用mavros连接到本地ros,运行以下命令打开gazebo仿真环境

    • roslaunch px4 mavros_posix_sitl.launch
      

    编写外部程序包

    首先需要在ROS工作空间下,在src目录下新建功能包

    cd ~/catkin_ws/src
    catkin_create_pkg offboard roscpp mavros geometry_msgs
    //catkin_create_pkg 是ROS命令,新建一个功能包
    //offboard 功能包名字
    //roscpp mavros geometry_msgs功能包依赖
    //命令格式catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
    

    在offboard功能包src目录下新建cpp文件,将外部程序控制文件写入保存

    • 新建cpp文件

    • touch offboard_node.cpp 
      

      新建cpp

    • 将以下程序写入到cpp文件,此程序参考的是PX4官网给出的例程。

    • /**
       * @file offb_node.cpp
       * @brief Offboard control example node, written with MAVROS version 0.19.x, PX4 Pro Flight
       * Stack and tested in Gazebo SITL
       */
      
      #include <ros/ros.h>
      #include <geometry_msgs/PoseStamped.h>
      #include <mavros_msgs/CommandBool.h>
      #include <mavros_msgs/SetMode.h>
      #include <mavros_msgs/State.h>
      
      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, "offb_node");
          ros::NodeHandle nh;
      
          //订阅mavros状态
          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");
          //定义设置模式服务客户端(设置offboard模式)
          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(20.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 = 10;
      
          //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();
                  }
              }
      
              local_pos_pub.publish(pose);
      
              ros::spinOnce();
              rate.sleep();
          }
      
          return 0;
      }
      
      
    • 在offboard目录下找到Cmakelists.txt文件,并设置程序运行节点,不然rosrun命令无法找到该节点,从而报错

    • cmake

    • 输入以下除蓝色字体的命令在这里插入图片描述 - 编辑好后即可进行编译

编译

  • 进入到catkin_ws目录下,运行终端

  • cd /catkin_ws
    catkin_make
    
    

catkin——make

  • 如上图显示编译成功

  • 运行程序包

  • rosrun offboard offboard_node
    
    

    起飞

  • 无人机实现自动起飞10米高,程序运行成功。

小结

  • 之所以要记录本次的过程,是因为自己对ROS工作模式的进一步了解,当然,实验这篇前需要去了解一下ROS语法,这里推荐古月居博主,可以在B站和csdn上都可以搜到。
  • 踩坑总结:
    • 在已经 建立工作空间的情况下,如果需要新建程序包,不要在工作空间目录(catkin_ws)下新建,而是要了解ros环境后在src目录下使用命令新建程序包,不然编译就会出错
    • 运行程序包的命令,不需要添加文件后缀名
    • 之所以会产生各种错误,是基于自己并不了解ros的工作模式和原理,实际上,只要自己有了经验,有了教训,下一次的建立会相比较第一次都会顺手很多。
    • 错误的不断产生让我一度以为自己的ros环境产生了怀疑,认为自己的环境搭建出错,但一切的根源就是自己的工作路径添加错误,对系统产生的错误需要自己一点点去啃。
    • 因为ROS系统产生错误显示的是英文,对于一些不常见的错误,可以利用有道词典的划词功能,对错误进行翻译,只有自己真正了解到这个错误,最终才能够有根据的去寻求答案。
  • 最后送句话给自己吧。“海压竹枝低复举,风吹山角晦还明”
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无人机仿真—PX4编译,gazebo仿真及简单off board控制模式下无人机起飞 的相关文章

随机推荐

  • 训练神经网络中最基本的三个概念:Epoch, Batch, Iteration

    转载地址 xff1a https zhuanlan zhihu com p 29409502 原作者 xff1a Michael Yuan 作者主页 xff1a https www zhihu com people mikeyuan 今天让
  • 使用makefile编译freeRTOS

    freeRTOS的文件结构 FreeRTOS LabsFreeRTOS Plus 包含freeRTOS 43 的组件和demo项目FreeRTOS 包含内核和demo项目 Source目录 xff1a 三个必须文件list c queue
  • 2013 一路走过

    2013 一路走过 想起当初找工作的时候 xff0c 一个人早上坐火车跑到其他大学的招聘会上去逛一圈 xff0c 了解招聘情况 然后下午又坐火车回学校 记得那天我投了十几份简历出去 xff0c 本打算投着试试 xff0c 没想到回来后有几家
  • 编译vs2008的samples程序总是跳过

    编译vs2008的samples程序总是跳过 xff0c 要配置属性还显示 未能完成操作 未指定的错误 的解决办法 作者 admin 分类 开发问题 发布时间 2013 03 12 09 22 974 浏览数 6 没有评论 文章转自王牌软件
  • MFC 用户界面线程:界面线程的退出 窗口关闭的流程

    原文链接 xff1a http wenku baidu com link url 61 6CFkWbLOeFgNoUsJniCX3ksw6 RztxMr9Z e6t7uu3e vV7UTKThUEkyRkq8IXwxIw5qYctN8gIx
  • MFC用户界面多线程实例2

    以下是 MFC 用户界面线程相关知识 由于用户界面线程含有自己的消息循环 xff0c 可以出来 Windows 消息 xff0c 并可创建和管理诸如窗口和控件等用户界面 元素 因此 xff0c 这 种线程较工程线程更为复杂 创建用户界面线程
  • 反汇编定位代码崩溃位置_1

    原帖 xff1a http blog csdn net gwzz1228 article details 9045853 利用map xff0c cod文件定位崩溃代码行 利用vs2010 新建一个空的控制台项目 xff0c 添加文件gtg
  • 反汇编定位代码崩溃位置_3

    原帖 xff1a http blog sina com cn s blog 141f234870102van8 html win7 43 vs2010通过map文件和cod文件找到崩溃的代码行 2015 01 11 11 31 04 转载
  • 反汇编定位代码崩溃位置_4

    原帖 xff1a http blog csdn net xiao article details 23177577 GDB如何从Coredump文件恢复动态库信息 标签 xff1a GDBcoredumpso调试动态库 2014 04 08
  • STM32Cube的串口设置(二)一个串口接收另一个串口发送

    串口系列 STM32Cube的串口设置 xff08 一 xff09 即学即用 通过串口设置第一部分大家应该基本会使用单个串口进行收发了 所以本次介绍通过串口进行转发 适合情景为一个串口设备波特率为38400 xff0c 但是接收模块仅支持1
  • C链表反转

    节点 struct Note int value Note pNext typedef struct Note PList 生成一个链表 Note GenerateList 输出一个链表 void PrintList Note pHead
  • PMP考试重点知识

    第一章 引论 前三章 是整个知识体系的支撑框架 xff0c 每次考试中都会考到 xff0c 但是一般在15道题左右 xff0c 前 三章 学不好后面的章 节很难理解透彻 1 项目的特点 xff1f 2 什么是项目管理 xff1f 3 项目和
  • pcb焊接技巧

    焊接的先后次序 要想更高效 可靠地焊好一块板子 xff0c 是要遵循一定的原则 xff08 如 先小后大 xff09 的 xff0c 不可乱来 xff0c 更不是看哪个元件顺眼就焊哪个 一般我拿到一块板子后的处理流程是 xff1a 打印 P
  • js中通过document获取标签节点

    使用id名表示标签 xff0c 不够严谨 在html语法中 xff0c id名随便起 xff0c 可以是js中的关键字 xff0c 但是在js中使用id代表标签 xff0c 就不能使用关键字 xff0c 所以我们需要一种更加严谨的方式获取标
  • 安装ubuntu-desktop

    目录 安装ubuntu desktop 解决root登录受限 安装远程访问软件 方法一 xff1a 安装vnc4server 方法二 xff1a Teamviwer安装 传送门 推荐 正文 回到顶部 安装ubuntu desktop 复制代
  • python读取C语言头文件

    在使用python编程过程中 xff0c 经常需要对C语言文件进行操作 xff0c 即 h文件进行读取操作 xff0c 这里举例说明 xff0c python读取C语言头文件 xff0c 提取其中 define 宏定义 废话少说 xff0c
  • makefile(详细讲解)

    目录 1 makeflie2 多个文件执行makefile 1 makeflie makefile带来的好处就是 自动化编译 xff0c 一旦写好 xff0c 只需要一个make命令 xff0c 整个工程完全自动编译 xff0c 极大的提高
  • WLAN、LAN、WAN的区别

    1 LAN局域网 xff08 Local Area Network xff09 xff1a 通俗讲就是路由器和用户之间接口 2 WAN广域网 xff08 Wide Area Network xff09 xff1a 通俗讲就是路由器和外部网络
  • PX4环境搭建记录(ROS+Gazebo+mavros+PX4+QGC)

    全过程记录PX4环境搭建 xff08 ROS 43 Gazebo 43 Mavros 43 PX4 43 QGC xff09 本人飞控专业在读 xff0c 近段时间在老师的建议下 xff0c 开始搭建PX4环境配置 因为并没有之前相关环境配
  • 无人机仿真—PX4编译,gazebo仿真及简单off board控制模式下无人机起飞

    无人机仿真 PX4编译 xff0c gazebo仿真及简单off board控制模式下无人机起飞 前言 在上篇记录中 xff0c 已经对整体的PX4仿真环境有了一定的了解 xff0c 现如今就要开始对无人机进行起飞等仿真环境工作 xff0c