jtson nano 手势控制ros小车

1.接线

5v---VCC

GND---GND

3---SDA

5---SCL 

sudo apt-get update sudo apt-get install -y i2c-tools

检查安装情况,终端输入: apt-cache policy i2c-tools

输出如下即为安装成功

i2c-tools:

已安装: 4.0-2

候选: 4.0-2

版本列表:

*** 4.0-2 500 500 http://ports.ubuntu.com/ubuntu-ports bionic/universe arm64 Packages 1 00 /var/lib/dpkg/status

安装 smbus2,才能与python2兼容

Pypi上可以下载smbus2
smbus2`PyPi

点击下载
在这里插入图片描述

 到下载的目录下解压
解压完:python setup.py install

gesture_control.launch文件

<launch>
    <!-- 开启机器人底层相关节点  -->
    <include file="$(find turn_on_wheeltec_robot)/launch/turn_on_wheeltec_robot.launch" />

    <node name="gesture_control" pkg="deskmedia" type="gesture_control.py" output="screen">
    <remap from="gesture_control/cmd_vel" to="/cmd_vel"/>
    </node>
</launch>

 gesture_control.py文件

#!/usr/bin/python
# -*- coding:utf-8 -*-
import time
import smbus2
import sys
import rospy
import curses
from geometry_msgs.msg import Twist
#i2c地址
PAJ7620U2_I2C_ADDRESS   = 0x73
#寄存器Bank选择
PAJ_BANK_SELECT         = 0xEF          #Bank0== 0x00,Bank1== 0x01
#寄存器Bank 0
PAJ_SUSPEND             = 0x03      #I2C suspend命令(写= 0x01进入挂起状态)。I2C唤醒命令是奴隶ID唤醒。参考主题“I2C总线定时特性和协议”
PAJ_INT_FLAG1_MASK      = 0x41      #手势检测中断标志掩码
PAJ_INT_FLAG2_MASK      = 0x42      #手势/PS检测中断标志掩码
PAJ_INT_FLAG1           = 0x43      #手势检测中断标志
PAJ_INT_FLAG2           = 0x44      #手势/PS检测中断标志
PAJ_STATE               = 0x45      #手势检测状态指示灯(仅在手势检测模式下起作用)
PAJ_PS_HIGH_THRESHOLD   = 0x69      #PS迟滞高阈值(仅在接近检测模式下起作用)    
PAJ_PS_LOW_THRESHOLD    = 0x6A      #PS迟滞低阈值(仅在接近检测模式下起作用)
PAJ_PS_APPROACH_STATE   = 0x6B      #PS趋近状态,趋近= 1,(8位PS数据>= PS高门限),不趋近= 0,(8位PS数据<= PS低门限)(仅在接近检测模式下有效)
PAJ_PS_DATA             = 0x6C      #PS 8位数据(仅在手势检测模式下有效)
PAJ_OBJ_BRIGHTNESS      = 0xB0      #物体亮度(最大255)
PAJ_OBJ_SIZE_L          = 0xB1      #对象大小(低8位)   
PAJ_OBJ_SIZE_H          = 0xB2      #对象大小(高8位)   
#寄存器Bank 1
PAJ_PS_GAIN             = 0x44      #PS增益设置(仅在接近检测模式下有效)
PAJ_IDLE_S1_STEP_L      = 0x67      #空闲S1步长,用于设置S1,响应系数(低8位)
PAJ_IDLE_S1_STEP_H      = 0x68      #空闲S1步长,用于设置S1,响应系数(高8位) 
PAJ_IDLE_S2_STEP_L      = 0x69      #空闲S2步长,用于设置S2,响应因子(低8位)
PAJ_IDLE_S2_STEP_H      = 0x6A      #空闲S2步长,用于设置S2,响应因子(高8位)
PAJ_OPTOS1_TIME_L       = 0x6B      #OPtoS1 Step,用于将操作状态的OPtoS1时间设置为待机1状态(低8位)
PAJ_OPTOS2_TIME_H       = 0x6C      #OPtoS1 Step,用于将OPtoS1运行状态时间设置为待机1 stateHigh 8位)  
PAJ_S1TOS2_TIME_L       = 0x6D      #S1toS2步,用于将待机1状态的S1toS2时间设置为待机2状态(低8位)  
PAJ_S1TOS2_TIME_H       = 0x6E      #S1toS2步,用于将待机1状态的S1toS2时间设置为待机2状态高8位) 
PAJ_EN                  = 0x72      #启用/禁用PAJ7620U2
#手势检测中断标志
PAJ_RIGHT               = 0x01 
PAJ_LEFT                = 0x02
PAJ_UP                  = 0x04 
PAJ_DOWN                = 0x08
PAJ_FORWARD             = 0x10 
PAJ_BACKWARD            = 0x20
PAJ_CLOCKWISE           = 0x40
PAJ_COUNT_CLOCKWISE     = 0x80
PAJ_WAVE                = 0x100

#启动初始化阵列
Init_Register_Array = (
    (0xEF,0x00),
    (0x37,0x07),
    (0x38,0x17),
    (0x39,0x06),
    (0x41,0x00),
    (0x42,0x00),
    (0x46,0x2D),
    (0x47,0x0F),
    (0x48,0x3C),
    (0x49,0x00),
    (0x4A,0x1E),
    (0x4C,0x20),
    (0x51,0x10),
    (0x5E,0x10),
    (0x60,0x27),
    (0x80,0x42),
    (0x81,0x44),
    (0x82,0x04),
    (0x8B,0x01),
    (0x90,0x06),
    (0x95,0x0A),
    (0x96,0x0C),
    (0x97,0x05),
    (0x9A,0x14),
    (0x9C,0x3F),
    (0xA5,0x19),
    (0xCC,0x19),
    (0xCD,0x0B),
    (0xCE,0x13),
    (0xCF,0x64),
    (0xD0,0x21),
    (0xEF,0x01),
    (0x02,0x0F),
    (0x03,0x10),
    (0x04,0x02),
    (0x25,0x01),
    (0x27,0x39),
    (0x28,0x7F),
    (0x29,0x08),
    (0x3E,0xFF),
    (0x5E,0x3D),
    (0x65,0x96),
    (0x67,0x97),
    (0x69,0xCD),
    (0x6A,0x01),
    (0x6D,0x2C),
    (0x6E,0x01),
    (0x72,0x01),
    (0x73,0x35),
    (0x74,0x00),
    (0x77,0x01),
)
#寄存器初始化数组
Init_PS_Array = (
    (0xEF,0x00),
    (0x41,0x00),
    (0x42,0x00),
    (0x48,0x3C),
    (0x49,0x00),
    (0x51,0x13),
    (0x83,0x20),
    (0x84,0x20),
    (0x85,0x00),
    (0x86,0x10),
    (0x87,0x00),
    (0x88,0x05),
    (0x89,0x18),
    (0x8A,0x10),
    (0x9f,0xf8),
    (0x69,0x96),
    (0x6A,0x02),
    (0xEF,0x01),
    (0x01,0x1E),
    (0x02,0x0F),
    (0x03,0x10),
    (0x04,0x02),
    (0x41,0x50),
    (0x43,0x34),
    (0x65,0xCE),
    (0x66,0x0B),
    (0x67,0xCE),
    (0x68,0x0B),
    (0x69,0xE9),
    (0x6A,0x05),
    (0x6B,0x50),
    (0x6C,0xC3),
    (0x6D,0x50),
    (0x6E,0xC3),
    (0x74,0x05),
)
#手势寄存器初始化数组
Init_Gesture_Array = (
    (0xEF,0x00),
    (0x41,0x00),
    (0x42,0x00),
    (0xEF,0x00),
    (0x48,0x3C),
    (0x49,0x00),
    (0x51,0x10),
    (0x83,0x20),
    (0x9F,0xF9),
    (0xEF,0x01),
    (0x01,0x1E),
    (0x02,0x0F),
    (0x03,0x10),
    (0x04,0x02),
    (0x41,0x40),
    (0x43,0x30),
    (0x65,0x96),
    (0x66,0x00),
    (0x67,0x97),
    (0x68,0x01),
    (0x69,0xCD),
    (0x6A,0x01),
    (0x6B,0xB0),
    (0x6C,0x04),
    (0x6D,0x2C),
    (0x6E,0x01),
    (0x74,0x00),
    (0xEF,0x00),
    (0x41,0xFF),
    (0x42,0x01),
)
class PAJ7620U2(object):
    def __init__(self,address=PAJ7620U2_I2C_ADDRESS):
        self._address = address
        self._bus = smbus2.SMBus(1)
        time.sleep(0.5)
        if self._read_byte(0x00) == 0x20:
            print("\nGesture Sensor OK\n")
            for num in range(len(Init_Register_Array)):
                self._write_byte(Init_Register_Array[num][0],Init_Register_Array[num][1])
        else:
            print("\nGesture Sensor Error\n")
        self._write_byte(PAJ_BANK_SELECT, 0)
        for num in range(len(Init_Gesture_Array)):
                self._write_byte(Init_Gesture_Array[num][0],Init_Gesture_Array[num][1])
    def _read_byte(self,cmd):
        return self._bus.read_byte_data(self._address,cmd)
    
    def _read_u16(self,cmd):
        LSB = self._bus.read_byte_data(self._address,cmd)
        MSB = self._bus.read_byte_data(self._address,cmd+1)
        return (MSB << 8) + LSB
    def _write_byte(self,cmd,val):
        self._bus.write_byte_data(self._address,cmd,val)
    def check_gesture(self):
        Gesture_Data=self._read_u16(PAJ_INT_FLAG1)
        if Gesture_Data == PAJ_UP:
            print("Up\r\n")
        elif Gesture_Data == PAJ_DOWN:
            print("Down\r\n")
        elif Gesture_Data == PAJ_LEFT:
            print("Left\r\n")   
        elif Gesture_Data == PAJ_RIGHT:
            print("Right\r\n")  
        elif Gesture_Data == PAJ_FORWARD:
            print("Forward\r\n")    
        elif Gesture_Data == PAJ_BACKWARD:
            print("Backward\r\n")
        elif Gesture_Data == PAJ_CLOCKWISE:
            print("Clockwise\r\n")  
        elif Gesture_Data == PAJ_COUNT_CLOCKWISE:
            print("AntiClockwise\r\n")  
        elif Gesture_Data == PAJ_WAVE:
            print("Wave\r\n")   
        return Gesture_Data
    def gesture_control(self,Gesture_Data,VV ,WW,times_loop):
        times_loop=50
        if Gesture_Data == PAJ_UP:
            VV=speed
            WW=0
        elif Gesture_Data == PAJ_DOWN:
            VV=-speed
            WW=0
        elif Gesture_Data == PAJ_LEFT:
            VV=0
            WW=turn
        elif Gesture_Data == PAJ_RIGHT:    
            VV=0
            WW=-turn  
        elif Gesture_Data == PAJ_FORWARD:
            VV=speed
            WW=0
        elif Gesture_Data == PAJ_BACKWARD:
            VV=-speed
            WW=0
        elif Gesture_Data == PAJ_CLOCKWISE:
            times_loop=100
            VV=0
            WW=-turn
        elif Gesture_Data == PAJ_COUNT_CLOCKWISE:
            times_loop=100
            VV=0
            WW=turn
        elif Gesture_Data == PAJ_WAVE:
            times_loop=0
            VV=0
            WW=0
        return     VV,WW,times_loop


# if __name__ == '__main__':
    
#     import time

#     print("\nGesture Sensor Test Program ...\n")

#     paj7620u2=PAJ7620U2()

#     while True:
#         time.sleep(0.05)
#         paj7620u2.check_gesture()



if __name__ == '__main__':
    
    import time

    print("\nGesture Sensor Test Program ...\n")

    paj7620u2=PAJ7620U2() #初始化IIC
    speed = 0.1 #默认移动速度 m/s 0.2
    turn  = 0.3   #默认转向速度 rad/s 1

    rospy.init_node('gesture_control')
    pub = rospy.Publisher('~cmd_vel', Twist, queue_size=5)#改成自己的topic
   
    r = rospy.Rate(10)   

    while True:
        r.sleep()
        Gesture_Data=paj7620u2.check_gesture()       
        VV=0
        WW=0
        times_loop=0
        VV ,WW,times_loop=paj7620u2.gesture_control(Gesture_Data,VV ,WW,times_loop)
        
        twist=Twist()
        twist.linear.x=VV
        twist.linear.y = 0
        twist.linear.z = 0
        twist.angular.x = 0
        twist.angular.y = 0
        twist.angular.z = WW
        if(VV!=0 or WW!=0):
            print("VV=%f,WW=%f,times_loop=%d\r\n",VV,WW,times_loop) 
            for i in range(times_loop):
                pub.publish(twist) #ROS发布速度话题
                time.sleep(0.05)







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chilian12321

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值