(无人机方向)ros小白之键盘控制无人机(终端方式)

news2024/10/7 16:15:52

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一:配置pycharm的ros开发环境
  • 二:核心代码讲解
  • 三 效果演示
    • XTDrone
  • 四 完整代码


前言

ubuntu 18.04
pycharm
ros melodic
做一个在终端中键盘输入指令,控制飞机起飞以及进入offbaord

一:配置pycharm的ros开发环境

File->Settings->Project Interpreter->右边小齿轮Show All->选中正在使用的python
点击右边最下面的图标,打开Interpreter Path
添加/opt/ros/indigo/lib/python2.7/dist-packages

在这里插入图片描述

二:核心代码讲解

def getKey():
    #这行代码使用tty模块的setraw()函数来设置标准输入(sys.stdin)的行为为原始模式。
    #原始模式下,输入不经过缓冲,每次输入一个字符。
    tty.setraw(sys.stdin.fileno())
    #这行代码使用select模块的select()函数来检查是否有可读取的数据。
    #它监视sys.stdin(标准输入),并且等待0.1秒钟。如果在等待期间有数据可读,
    #则select()函数会返回一个非空的可读列表(rlist),否则返回空列表
    rlist, _, _ = select.select([sys.stdin], [], [], 0.1)
    #这段代码检查rlist列表是否非空。如果列表非空,说明在等待期间有数据可读。
    #此时,通过sys.stdin.read(1)读取一个字符,并将其赋值给key变量。
    #如果列表为空,则说明在等待期间没有数据可读,此时将key变量赋值为空字符串。
    if rlist:
        key = sys.stdin.read(1)
    else:
        key = ''
    #这行代码使用termios模块的tcsetattr()函数来恢复标准输入的设置。
    #TCSADRAIN参数表示在所有排队的输出都被传输和处理之后才生效。
    #将标准输入的属性设置为之前保存的settings值。它使用termios.tcsetattr函数来设置终端的属性。
    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)
    #最后,函数返回变量key的值,即读取到的字符(如果有)或空字符串(如果没有读取到字符)。
    return key

三 效果演示

在不同的仿真环境中,话题名称可能不一致,需要改源码的话题名称

XTDrone

roslaunch px4 outdoor1.launch
python my_keyboard_control.py#键盘控制代码

在这里插入图片描述

四 完整代码

# coding=utf-8
import mavros_msgs
import rospy
from mavros_msgs.srv import SetMode,CommandBool

import sys, select, os
#os模块是用于与操作系统进行交互的模块。TTY(teletypewriter)是指终端设备,例如终端窗口、终端控制台或串口终端。
#select 模块:该模块提供了对低级 I/O 多路复用的支持。
#termios模块是Python中用于处理终端IO(Input/Output)的模块,允许我们控制终端的特性(attributes),例如字符的读取方式、输入输出模式等。
import tty, termios
from std_msgs.msg import String


cmd_vel_mask = False


msg2all = """
请输入输入指令:
r   : return home
t/y : arm/disarm
v/n : takeoff/land
b   : offboard
s/k : hover and remove the mask of keyboard control
CTRL-C to quit
"""





def getKey():
    #这行代码使用tty模块的setraw()函数来设置标准输入(sys.stdin)的行为为原始模式。
    #原始模式下,输入不经过缓冲,每次输入一个字符。
    tty.setraw(sys.stdin.fileno())
    #这行代码使用select模块的select()函数来检查是否有可读取的数据。
    #它监视sys.stdin(标准输入),并且等待0.1秒钟。如果在等待期间有数据可读,
    #则select()函数会返回一个非空的可读列表(rlist),否则返回空列表
    rlist, _, _ = select.select([sys.stdin], [], [], 0.1)
    #这段代码检查rlist列表是否非空。如果列表非空,说明在等待期间有数据可读。
    #此时,通过sys.stdin.read(1)读取一个字符,并将其赋值给key变量。
    #如果列表为空,则说明在等待期间没有数据可读,此时将key变量赋值为空字符串。
    if rlist:
        key = sys.stdin.read(1)
    else:
        key = ''
    #这行代码使用termios模块的tcsetattr()函数来恢复标准输入的设置。
    #TCSADRAIN参数表示在所有排队的输出都被传输和处理之后才生效。
    #将标准输入的属性设置为之前保存的settings值。它使用termios.tcsetattr函数来设置终端的属性。
    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)
    #最后,函数返回变量key的值,即读取到的字符(如果有)或空字符串(如果没有读取到字符)。
    return key



def print_msg():
        print(msg2all)


#主函数
if __name__=="__main__":
#设置终端为标准输入流
    settings = termios.tcgetattr(sys.stdin)

    rospy.init_node('my_keyboard_control')
    multi_cmd_ser = rospy.ServiceProxy("/iris_0/mavros/set_mode",SetMode)
    multi_arm_ser=rospy.ServiceProxy("/iris_0/mavros/cmd/arming",mavros_msgs.srv.CommandBool)

    print_msg()
    cmd=""
    while(1):
        key = getKey()#获取读取到的字符
        if key == 'r':
            cmd = 'AUTO.RTL'
            print_msg()
            print('Returning home')
        elif key == 't':
            cmd = 'ARM'
            print_msg()
            print('Arming')
        elif key == 'y':
            cmd = 'DISARM'
            print_msg()
            print('Disarming')
        elif key == 'v':
            cmd = 'AUTO.TAKEOFF'
            print_msg()
            #print('Takeoff mode is disenabled now')
        elif key == 'b':
            cmd = 'OFFBOARD'
            print_msg()
            print('Offboard')
        elif key == 'n':
            cmd = 'AUTO.LAND'
            print_msg()
            print('Landing')
        elif key in ['k', 's']:
            cmd = 'HOVER'
            print_msg()
            print('Hover')
        elif(key == '\x03'):
                break

        if (cmd=='ARM'):
            multi_arm_ser(True)
        elif (cmd=='DISARM'):
            multi_arm_ser(False)
        else:
            multi_cmd_ser(custom_mode=cmd)


        cmd = ''

    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/800188.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 截图功能实现

Android 截图功能实现 简介效果图功能实现1. 截取当前可见范围屏幕2. 截取当前可见范围屏幕(不包含状态栏)3. 截取某个控件4. 截取ScrollView5. 长截图6. 截屏动画效果7. 显示截屏结果,自动消失6. 完整代码 简介 在Android应用中开发截图功能…

Kibana+Prometheus+node_exporter 监控告警部署

下载好三个软件包 一、prometheus安装部署 1、解压 linxxubuntu:~/module$ tar -xvf prometheus-2.45.0-rc.0.linux-amd64.tar.gz 2、修改配置文件的IP地址 # my global config global:scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is ever…

xshell连接Windows中通过wsl安装的linux子系统-Ubuntu 22.04

xshell连接Windows中通过wsl安装的linux子系统-Ubuntu 22.04 一、安装linux子系统 1.1、 启动或关闭Windows功能-适用于Linux的Windows子系统 1.2 WSL 官方文档 使用 WSL 在 Windows 上安装 Linux //1-安装 WSL 命令 wsl --install//2-检查正在运行的 WSL 版本:…

LeetCode221.Maximal-Square<最大正方形>

题目&#xff1a; 思路&#xff1a; 这题是动态规划&#xff0c;但是不会写。想着判断dp的 <上&#xff0c;左&#xff0c;左上> 去了。发现只能这样最大只能判断面积为4的正方形因为只会判断另外三个方格。而要想判断更大的正方形那就需要递归操作了。那肯定会超时了。…

乌班图安装MySQL5.7时的故障求解

wget https://dev.mysql.com/get/mysql-apt-config_0.8.12-1_all.deb dpkg -i mysql-apt-config_0.8.12-1_all.deb apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 467B942D3A79BD29 apt update

微信小程序云开发快速入门

什么是云开发&#xff1f; 云开发是可以帮助我们快速成为全栈的一种后端云服务&#xff0c;采用的是Serverless的架构。开发者无须搭建服务器&#xff0c;可直接使用其中的云数据库、云存储、云函数等云服务基础功能。 那么这个时候你可能会想&#xff0c;这和现在的传统开发…

Educational Codeforces Round 152 (Rated for Div. 2) D题 1849D Array Painting

传送门 https://codeforces.com/contest/1849/problem/D D. Array Painting 题意 题解 分类讨论 这题的精髓在于欠债 用一个a0表示当前有没有负债 当前欠债最多为1 首先我们讨论, 在不欠债的情况下遇到0是怎么模拟的: 前面有能够产生贡献的12连通块 例如: 12110 很明显答案…

vue element ui el-tree 通过子节点反向递归查找父节点

今天做了一个项目采用的是element tree组件&#xff0c;要求子父节点不强关联&#xff0c;但是当我点击子节点时&#xff0c;会反向的选择所有的父节点&#xff0c;如下图&#xff1a; 当我点击电话时&#xff0c;往上一层的“电话”和“我的”均为父级以上的节点&#xff0c;全…

Practice1|1207. 独一无二的出现次数、1365. 有多少小于当前数字的数字、941. 有效的山脉数组

1207. 独一无二的出现次数 1.题目&#xff1a; 给你一个整数数组 arr&#xff0c;请你帮忙统计数组中每个数的出现次数。 如果每个数的出现次数都是独一无二的&#xff0c;就返回 true&#xff1b;否则返回 false。 示例 1&#xff1a; 输入&#xff1a;arr [1,2,2,1,1,3…

安卓的播放器对比与选型(vlc,EXOplayer,Ijkplayer,GSYVideoPlayer)详细过程

安卓的播放器对比与选型&#xff08;vlc&#xff0c;EXOplayer&#xff0c;Ijkplayer&#xff0c;GSYVideoPlayer&#xff09;&#x1f4fa;详细过程 前言一、vlc二、EXOplayer三、Ijkplayer四、GSYVideoPlayer&#x1f525;&#x1f525;&#x1f525;五、其他的开源播放器jia…

婚庆服务小程序app开发方案详解

开发一款婚庆行业服务小程序有哪些功能呢&#xff1f; 1、选择分类 选择婚庆、婚车、婚宴、司仪、彩妆、婚庆用品、跟拍、摄影等&#xff0c;筛选出对应的商家 2、选择商家 选择分类后&#xff0c;可以选择商家&#xff0c;查看各个商家的详细介绍情况。 3、选择服务套餐 各…

Linux虚拟机(lvm)报Unmount and run xfs_repair

问题 linux系统没有正常关机&#xff0c;今天启动虚拟机无法进入系统&#xff0c;提示metadata corruption deleted at xxxx&#xff1b; Unmount and run xfs_repair 分析 主机异常掉电后里面的虚拟机无法启动&#xff0c;主要是损坏的分区 解决 看出来应该是dm-0分区损坏…

应急响应经典案例-FTP 暴力破解

应急响应经典案例-FTP 暴力破解 应急场景日志分析应急处理措施 应急场景 从昨天开始&#xff0c;网站响应速度变得缓慢&#xff0c;网站服务器登录上去非常卡&#xff0c;重启服务器就能保证一段时间的正常访问&#xff0c;网站响应状态时而飞快时而缓慢&#xff0c;多数时间是…

华为云安装MySQL后,本地工具连接MySQL失败

华为云安装MySQL后&#xff0c;本地连接失败 排查问题步骤&#xff1a; 在此之前需要在MySQL创建用户&#xff0c;并赋予权限。 1、能否ping通。 在本地命令行(Windows&#xff1a;winR)通过ping命令&#xff0c;ping服务器地址&#xff0c;看能否ping通。不能则需要检查本地…

Redis服务优化

目录 一.Rde高可用 二.Rdies持久化 2.1持久化的功能 2.2Redis 提供两种方式进行持久化 三.RDB持久化 3.1触发条件 3.1.1手动触发 3.1.2自动触发 3.1.3其他自动触发机制 3.1.4执行流程 3.1.5启动时加载 四.AOF持久化 4.1开启AOF 4.2执行流程 4.2.1命令追加(append) 4.2.2文件写…

ThinkPHP8知识详解:安装ThinkPHP8

我们在讲解前面的文章《搭建PHP8集成环境》和《给PHP8和MySQL8添加到环境变量》以后&#xff0c;现在可以正式的安装ThinkPHP8啦、 1、打开phpenv&#xff0c;启动服务&#xff0c;打开昨天新建的tp8.com的目录&#xff08;D:\phpEnv\www\tp8.com&#xff09;&#xff0c;把里…

LLM系列 | 18 : 如何用LangChain进行网页问答

简介 一夕轻雷落万丝&#xff0c;霁光浮瓦碧参差。 紧接之前LangChain专题文章&#xff1a; 15:如何用LangChain做长文档问答&#xff1f;16:如何基于LangChain打造联网版ChatGPT&#xff1f;17:ChatGPT应用框架LangChain速成大法 今天这篇小作文是LangChain实践专题的第4…

关于element ui 安装失败的问题解决方法并查看是否安装成功

报错信息&#xff1a; 解决办法&#xff1a; 使用命令&#xff1a; npm install --legacy-peer-deps element-ui --save 查看是否安装成功&#xff1a; 方法一&#xff1a;在package.json文件中查看是否有element-ui版本 方法二&#xff1a;查看node_modules目录下是否有elem…

宝塔设置云服务器mysql端口转发,实现本地电脑访问云mysql

环境&#xff1a;centos系统使用宝塔面板 实现功能&#xff1a;宝塔设置云服务器mysql端口转发&#xff0c;实现本地电脑访问mysql 1.安装mysql、PHP-7.4.33、phpMyAdmin 5.0 软件商店》搜索 mysql安装即可 软件商店》搜索 PHP安装7.4.33即可&#xff08;只需要勾选快速安装&…

Vue 3:玩一下web前端技术(一)

前言 本章内容为VUE前端环境搭建与相关前端技术讨论。 下一篇文章地址&#xff1a; &#xff08;暂无&#xff09; 一、环境搭建 1. 安装Node.js Vue是基于Node.js的&#xff0c;因此首先需要安装Node.js。官网地址&#xff1a;Node.js 2. 安装Vue CLI Vue CLI是一个用…