使用ROS节点控制PX4——位置控制

2023-05-16

上一篇简要介绍了ROS控制PX4并使用仿真环境进行调试的框架

点击打开链接

本篇将详细介绍ROS节点的发布与订阅细节,并使用gazebo进行仿真调试。

任务:实现飞机的自动起飞,然后在两点之间循环飞行数次,最后自动降落。

1.使用RoboWare在已经建立好的工作空间中新建立一个holdheight.cpp用于写控制命令

    ps:有时RoboWare会把之前已经打开的工作空间丢失

    解决方法:进入工作空间目录,使用ls -a查看隐藏文件,将.vscode文件夹删除

rm -rf /.vscode

    然后进入RoboWare,打开已有工作空间,以我的为例,将目录设置为catkin_ws即可,不是进入catkin_ws/src/

2.代码编写

#include <ros/ros.h>
#include <geometry_msgs/PoseStamped.h>
#include <mavros_msgs/CommandBool.h>
#include <mavros_msgs/SetMode.h>
#include <mavros_msgs/State.h>
#include <geometry_msgs/TwistStamped.h>
#include <string>
#include <sstream>
#include <iostream>
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, "holdheight");
    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");
    //ros::Publisher velocity_pub = nh.advertise<geometry_msgs::TwistStamped>
           // ("mavros/setpoint_velocity/cmd_vel", 10);
    //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 = 5;

    mavros_msgs::SetMode offb_set_mode;
    offb_set_mode.request.custom_mode = "OFFBOARD";
    mavros_msgs::CommandBool arm_cmd;
    arm_cmd.request.value = true;
    int state = 3;
    ros::Time last_request = ros::Time::now();
    while(ros::ok() ){
       
       if( !current_state.armed ){
                if( arming_client.call(arm_cmd) &&
                    arm_cmd.response.success){
                    ROS_INFO("Vehicle armed");
                }
            }
        if( current_state.mode != "OFFBOARD"){
            if( set_mode_client.call(offb_set_mode) &&
                offb_set_mode.response.success){
                ROS_INFO("Offboard enabled");
            }
        } 

        if( (ros::Time::now() - last_request > ros::Duration(5.0))) break;

        ros::spinOnce();
        rate.sleep();
    }
    while(state--) {
        last_request = ros::Time::now();
        while(ros::ok()) {
            if( (ros::Time::now() - last_request > ros::Duration(5.0))) break;
           
            pose.pose.position.x = 0;
            pose.pose.position.y = 0;
            local_pos_pub.publish(pose);
            //geometry_msgs::TwistStamped velocity_tw;
            //velocity_pub.publish(velocity_tw);
            ROS_INFO("111111");
            ros::spinOnce();
            rate.sleep();
        }
        last_request = ros::Time::now();
        while(ros::ok()) {
           if( (ros::Time::now() - last_request > ros::Duration(5.0))) break;
           
           pose.pose.position.x = 5;
           pose.pose.position.y = 5;
           local_pos_pub.publish(pose);
           //geometry_msgs::TwistStamped velocity_tw;
           //velocity_pub.publish(velocity_tw);
           ROS_INFO("222222");
           ros::spinOnce();
           rate.sleep();
       }
       ROS_INFO_STREAM("state="<<state);
    }
    offb_set_mode.request.custom_mode = "AUTO.LAND";
    if( set_mode_client.call(offb_set_mode) && offb_set_mode.response.success)
    {
        ROS_INFO("AUTO.LAND enabled");
        last_request = ros::Time::now();
    }

    return 0;
}

3.代码说明:

    首先根据节点要实现的功能订阅mavros中相应的节点,因为我要控制PX4的位置,所以要订阅发布位置消息的节点;因为要获取  飞机模式,所以要订阅获取模式的节点。。。

以位置节点为例,对订阅格式进行说明:

    ros::Publisher local_pos_pub = nh.advertise<geometry_msgs::PoseStamped>
            ("mavros/setpoint_position/local", 10);

其中的Publisher说明我要向mavros的local_position节点发布消息


根据wiki mavros中的说明将<>和()的内容填写上即可。注意要相应的把该节点地址include一下

#include <geometry_msgs/PoseStamped.h>


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

使用ROS节点控制PX4——位置控制 的相关文章

随机推荐

  • FreeRTOS之vTaskDelete()

    vTaskDelete 函数解析 task span class token punctuation span h span class token keyword void span span class token function v
  • MobaXterm连接不上虚拟机linux的问题

    目录 问题描述 xff1a step1 进入centOS下的 etc sysconfig network scripts step2 输入命令vi ifcfg ens33 查看并编辑该文件 step3 将文件中的 step4 重启网络服务
  • Linux LVM root分区 磁盘扩容

    LVM 的基本概念 物理卷 Physical Volume PV xff1a 可以在上面建立卷组的媒介 xff0c 可以是硬盘分区 xff0c 也可以是硬盘本身或者 回环文件 xff08 loopback file xff09 物理卷包括一
  • 浅尝树莓派3之串口配置

    树莓派3硬件串口的使用及编程 发表于 2017 01 29 分类于 树莓派 暂无评论 阅读次数 54 引言 本文转载自 xff1a http etrd org 2017 01 29 E6 A0 91 E8 8E 93 E6 B4 BE3 E
  • Android开发必备——注解

    前言 阅读官方源码以及各类第三方框架时可以发现 xff0c 很多地方都有注解 xff0c 作为一名Android程序员 xff0c 掌握注解属于必不可少的一项技能 1 什么是注解 注解是以 64 符号开头的用来标识如类 字段 方法等的工具
  • ROS 'catkin_make' 命令出错

    之前 xff0c 我在自己的电脑上 xff08 新安装的ubuntu16 04 xff09 装好了ROS xff0c 用catkin make编译成功了 xff0c 但是用一样的方法在实验室的电脑上编译就报错 xff0c 后来发现和之前装过
  • PX4 里面的TCP服务端代码

    PX4 里面的TCP服务端代码 span class token comment examples nettest nettest server c Copyright C 2007 2011 2012 Gregory Nutt All r
  • 传感器研究NO1.陀螺仪

    一 陀螺仪重要参数 如下图所示 xff0c 一般陀螺仪手册具有很多参数 xff0c 此处仅记录软件编程应注意的参数 Full Scale Range xff08 量程 xff09 xff1a dps xff08 Degree Per Sec
  • ESP8266与电脑PC端TCP通讯步骤+例子一

    我们先讲 xff0c 拿到一个ESP8266模块之后 xff0c 该做什么 我拿到这个模块之后 xff0c 一脸蒙蔽 xff0c 我不知道怎么使用 xff0c 这个时候 xff0c 不要慌 xff0c 去看技术手册 我4步让你学会最简单的使
  • 读java编程思想的一点感触

    学习一些java基础语法后 xff0c 能应付简单的日常工作 但是觉得还是得系统学习一下这门语言 xff0c 就选择了java编程思想 原书第4版 xff0c 机械工业出版社 xff0c 陈昊鹏译的这本 看懂的不是很多 xff0c 还是学到
  • linux---UDP代码通信

    udp连接特性 xff1a 无连接 xff1a 可以不构成连接就进行通信不可靠 xff1a 数据并不能保证可靠性面向数据报 xff1a 每条数据有长度限制 xff0c 整条数据发送整条数据接受 xff0c 传输不灵活 xff0c 但是不会存
  • virtualBox安装debian9.5的网络配置杂记

    2019 02 01补充 桥接模式设置方式 1 虚拟机界面 gt 设备 gt 网络 gt 网络 gt 网卡1 gt 桥接网卡 2 连接虚拟机 xff0c 为虚拟机配置一个ip地址即可 ip a add 192 168 0 107 24 de
  • 如何在linux shell脚本中自动输入密码.

    答案是需要通过expect 来实现 注意 如果没有 expect xff0c 需要预先安装 tony 64 pd2 yum info expect Loaded plugins fastestmirror Repodata is over
  • 动态捕捉(四)深度图像基础知识

    第一部分 xff1a 深度图像 xff08 depth image 也被称为距离影像 xff08 range image xff09 xff0c 是指将从图像采集器到场景中各点的距离 xff08 深度 xff09 作为像素值的图像 xff0
  • 完善二叉树的右指针

    对于一个二叉树 xff0c 每个结点有三个指针 xff0c 除了左右子节点指针外还有一个指向右边的结点的指针 现在给定一个二叉树 xff0c 每个结点的右指针为空 xff0c 让你把每一层的结点都连起来 xff08 默认是完全二叉树 xff
  • dockerfile文件参数

    一 背景 如果仅限于使用dockerhub里面的镜像 xff0c 是没办法满足我们实际的应用场景的 xff0c 所以我们需要创建属于自己的docker镜像 构建docker镜像需要编写dockerfile xff0c 却不知道语法怎么写 下
  • pycharm 不能单步调试(debug)的原因,或者点击debug不能进入断点。debug区域是灰色的

    如上图 xff0c 不要点击pycharm右上角的Debug 那样不能进入调试 xff08 在多个py文件都存在的情况下 xff09 xff0c 找到程序的入口点出 xff08 if name 61 61 34 main xff09 xff
  • 进程切换时是如何保存上下文的

    前言 当前操作系统大部分采用分时的进程调度 既每个进程运行一小段时间 然后切换到下一个进程运行 依次往复 当进程运行的时候是独占CPU的 此时操作系统是无法强行介入的 为了将执行权让出来 就需要硬件的配合了 硬件每个一个时钟周期 比如10m
  • 使用ROS节点控制PX4——总体流程

    1 安装ROS IDE xff1a Roboware Studio xff08 只支持linux xff09 网址 xff1a http www roboware me Roboware可以很方便的创建工作空间 xff0c 编写程序后可以自
  • 使用ROS节点控制PX4——位置控制

    上一篇简要介绍了ROS控制PX4并使用仿真环境进行调试的框架 点击打开链接 本篇将详细介绍ROS节点的发布与订阅细节 xff0c 并使用gazebo进行仿真调试 任务 xff1a 实现飞机的自动起飞 xff0c 然后在两点之间循环飞行数次