ros-robotics 原文存档

210922记录ros运行超声波过程 包含Twist概念

· 更新于

ros超声波

`root@clbrobot:/home/ubuntu# rosrun lbtopic2 teleop_twist_keyboard1sonar.py`
`#!/usr/bin/python # -*- coding: utf-8 -*- import time import RPi.GPIO as GPIO import numpy as np trigger_pin = 37 echo_pin = 35  GPIO.setmode(GPIO.BOARD) GPIO.setup(trigger_pin,GPIO.OUT) GPIO.setup(echo_pin,GPIO.IN) GPIO.setwarnings(False)  def send_trigger_pulse():     GPIO.output(trigger_pin,True)     time.sleep(0.0001)     GPIO.output(trigger_pin,False)  def wait_for_echo(value,timeout):     count = timeout     while GPIO.input(echo_pin) != value and count>0:         count = count-1  def get_distance():     send_trigger_pulse()     wait_for_echo(True,10000)     start = time.time()     wait_for_echo(False,10000)     finish = time.time()     pulse_len = finish-start     distance_cm = pulse_len/0.000058     return distance_cm  def lbmean(list,len):     sum=0;     #b=len(list)     for i in range(0,len):         sum+=list[i];     return(sum/(len*1.0))  def sonar_filter_distance():     each_value=[]#空列表     diff_value=[]#空列表,要计算差值     ev_local=0#最大偏差值的真实下标     df_local=0     output_value=0     #读8次     for i in range(1,9):         each_value.append(get_distance())     each_value.sort()#排序     #print(each_value)     #计算差值     for i in range(0,7):         diff_value.append(each_value[i+1]-each_value[i])     #找到最大的差值在each_value的位置     df_local=diff_value.index(max(diff_value))     ev_local=df_local+1     #计算each_value的平均值     #avr_each=lbmean(each_value)      # #判断最大差值的数据与平均值的关系     # if ev_local<4:     #     output_value=lbmean(each_value[(ev_local+1):],9-ev_local-1)     # elif ev_local>4:     #     output_value=lbmean(each_value[:(ev_local)],ev_local)     # else:     #     output_value=lbmean(each_value.pop(ev_local),8)     # return output_value     if ev_local<4:         output_value=np.mean(each_value[(ev_local+1):])     elif ev_local>4:         output_value=np.mean(each_value[:(ev_local)])     else:         output_value=np.mean(each_value.pop(ev_local))     return output_value                  # while True: #    print("cm = %f",sonar_filter_distance()) #    time.sleep(1)`
`#!/usr/bin/env python import roslib; roslib.load_manifest('teleop_twist_keyboard') import rospy import hcsr04 import RPi.GPIO as GPIO from geometry_msgs.msg import Twist  import sys, select, termios, tty  msg = """ Reading from the keyboard  and Publishing to Twist! --------------------------- Moving around:    u    i    o    j    k    l    m    ,    .  For Holonomic mode (strafing), hold down the shift key: ---------------------------    U    I    O    J    K    L    M    <    >  t : up (+z) b : down (-z)  anything else : stop  q/z : increase/decrease max speeds by 10% w/x : increase/decrease only linear speed by 10% e/c : increase/decrease only angular speed by 10%  CTRL-C to quit """  moveBindings = { 		'i':(1,0,0,0), 		'o':(1,0,0,-1), 		'j':(0,0,0,1), 		'l':(0,0,0,-1), 		'u':(1,0,0,1), 		',':(-1,0,0,0), 		'.':(-1,0,0,1), 		'm':(-1,0,0,-1), 		'O':(1,-1,0,0), 		'I':(1,0,0,0), 		'J':(0,1,0,0), 		'L':(0,-1,0,0), 		'U':(1,1,0,0), 		'<':(-1,0,0,0), 		'>':(-1,-1,0,0), 		'M':(-1,1,0,0), 		't':(0,0,1,0), 		'b':(0,0,-1,0), 	       }  speedBindings={ 		'q':(1.1,1.1), 		'z':(.9,.9), 		'w':(1.1,1), 		'x':(.9,1), 		'e':(1,1.1), 		'c':(1,.9), 	      }  def getKey(): 	tty.setraw(sys.stdin.fileno()) 	select.select([sys.stdin], [], [], 0) 	key = sys.stdin.read(1) 	termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings) 	return key   def vels(speed,turn): 	return "currently:\tspeed %s\tturn %s " % (speed,turn) def sonar_distance(): 	return hcsr04.get_distance()  if __name__=="__main__":     	settings = termios.tcgetattr(sys.stdin) 	 	pub = rospy.Publisher('cmd_vel', Twist, queue_size = 1) 	rospy.init_node('teleop_twist_keyboard')  	speed = rospy.get_param("~speed", 0.5) 	turn = rospy.get_param("~turn", 1.0) 	x = 0 	y = 0 	z = 0 	th = 0 	status = 0  	try: 		#GPIO.cleanup() 		print msg 		print vels(speed,turn) 		while(1): 			key = getKey() 			sonar_cm = sonar_distance() 			#50cm 			if sonar_cm<50: 				sonar_cm2 = sonar_distance() 				if sonar_cm2<50: 					key = '8' 					print("Dangerous distance is %f\t",sonar_cm2) 			# else: 			# 	key = getKey() 			# 	print("Safe distance isDangerous distance is %f\t",sonar_cm) 			if key in moveBindings.keys(): 				x = moveBindings[key][0] 				y = moveBindings[key][1] 				z = moveBindings[key][2] 				th = moveBindings[key][3] 			elif key in speedBindings.keys(): 				speed = speed * speedBindings[key][0] 				turn = turn * speedBindings[key][1]  				print vels(speed,turn) 				if (status == 14): 					print msg 				status = (status + 1) % 15 			else: 				x = 0 				y = 0 				z = 0 				th = 0 				if (key == '\x03'): 					break  			twist = Twist() 			twist.linear.x = x*speed; twist.linear.y = y*speed; twist.linear.z = z*speed; 			twist.angular.x = 0; twist.angular.y = 0; twist.angular.z = th*turn 			pub.publish(twist) 		GPIO.cleanup( (35, 37) )  	except Exception,err: 		print(err) 		#GPIO.cleanup()  	finally: 		twist = Twist() 		twist.linear.x = 0; twist.linear.y = 0; twist.linear.z = 0 		twist.angular.x = 0; twist.angular.y = 0; twist.angular.z = 0 		pub.publish(twist) 		GPIO.cleanup( (35, 37) ) 		termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)`

ROS Twist

包括线速度xyz和角速度xyz