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

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

文章目录


前言

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

二:核心代码讲解

python 复制代码
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

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

四 完整代码

python 复制代码
# 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)
相关推荐
Ali阿狸的梦想5 小时前
无人机影像处理系统技术选型
无人机
大泽泽的小可爱9 小时前
NeurIPS24 | 多无人机协作精确预测车辆等目标移动轨迹, Drones Help Drones
无人机
梦想科研社1 天前
【无人机设计与控制】基于Q-learning三次样条曲线求解三维无人机路径规划问题
无人机
安徽京准1 天前
京准时钟:无人机卫星信号安全防护隔离装置
安全·无人机·信号安全防护装置·卫星安全隔离装置·北斗授时安全隔离·北斗对时防护隔离装置
云卓SKYDROID2 天前
无人机声学侦测算法详解!
算法·无人机·科普·知识·云卓科技
云卓科技3 天前
无人机之中继通信技术篇
科技·嵌入式硬件·安全·机器人·无人机
鹧鸪云光伏与储能软件开发3 天前
光伏无人机踏勘,照亮光伏未来!
分布式·无人机·光伏发电·光伏·光伏设计·光伏管理
创小董3 天前
无人机的就业前景怎么样?
无人机
云卓SKYDROID5 天前
旋转翼巡检无人机飞行算法及关键技术综述!
科技·算法·无人机·科普·云卓科技
Perishell7 天前
无人机避障——路径规划篇(一) JPS跳点搜索算法&A*算法对比
linux·算法·ubuntu·动态规划·无人机·1024程序员节