2016-03-17 59 views
1

我們想要使用從連接到Raspberry pi 2上的GPIO引腳的電位計獲得的值控制P3DX機器人。目前,我們有兩個Python文件:一個移動機器人,讀取連接電位器的GPIO引腳。這兩個文件已經在自己的工作。但是有可能將這兩個文件合併成一個文件並運行它?因爲我在考慮與ROS連接的Python文件需要單獨運行。如果不是,實現我們想要做的最簡單的方法是什麼?在Raspberry Pi 2型號B上使用GPIO引腳來控制運行ROS的P3DX機器人

***更新: 本質上,我們試圖使用懸鏈線方法來移動兩個機器人。所以我們要測量電位器用繩子的角度,其中另一端連接到另一個機器人。根據角度給出機器人的方向,然後我們可以進行適當的調整,將機器人重新對準中心線,以便機器人跟隨前面的第一個機器人。

我們按照此鏈接瞭解如何將電位計連接到Raspberry Pi 2並讀取數值。它還包括腳本文件: https://learn.adafruit.com/downloads/pdf/reading-a-analog-in-and-controlling-audio-volume-with-the-raspberry-pi.pdf

下面是移動P3DX文件:`

#!/usr/bin/env python 
import getch 
import roslib; roslib.load_manifest('p3dx_mover') 
import rospy 

from geometry_msgs.msg import Twist 

KEY_UP = 65 
KEY_DOWN = 66 
KEY_RIGHT = 67 
KEY_LEFT = 68 
USER_QUIT = 100 

MAX_FORWARD = 1.1 
MAX_LEFT = 0.3 
MIN_FORWARD = -1.1 
MIN_LEFT = -0.3 

forward = 0.0 
left = 0.0 
keyPress = 0 

while(keyPress != USER_QUIT): 
    pub = rospy.Publisher('RosAria/cmd_vel', Twist) 
    rospy.init_node('p3dx_mover') 

    twist = Twist() 

    keyPress = getch.getArrow() 

    if((keyPress == KEY_UP) and (forward <= MAX_FORWARD)): 
     forward += 0.1 
    elif((keyPress == KEY_DOWN) and (forward >= MIN_FORWARD)): 
     forward -= 0.1 
    elif((keyPress == KEY_LEFT) and (left <= MAX_LEFT)): 
     left += 0.1 
    elif((keyPress == KEY_RIGHT) and (left >= MIN_LEFT)): 
     left -= 0.1 

    twist.linear.x = forward 
    twist.angular.z = left 
    pub.publish(twist) 

pub = rospy.Publisher('RosAria/cmd_vel', Twist) 
rospy.init_node('p3dx_mover') 
twist = Twist() 
pub.publish(twist) 
exit() 

` 下面是我們用於讀取電位器的電壓電平值的鏈接: https://gist.github.com/ladyada/3151375 忽略體積東西,我們沒有包括他們。只是讀鍋。

+0

歡迎來到Stack Overflow!歡迎來到Stackoverflow!您能否詳細說明您的問題,比如代碼或其他事情,以便人們能夠儘早解決問題並幫助您?謝謝! – manetsus

+0

1)請顯示你的代碼(或者你正在做的一個簡單的例子)。否則,這太寬泛了。 然而,真正的問題歸結於此 - 你是否需要這兩種操作連續發生,獨立於彼此?無論哪種方式,您都可以將其組合成一個程序/文件。但是,如果您需要它們獨立運行而不會阻塞彼此,我們可能需要一些多處理! – Will

+0

*「讀取連接到電位計的GPIO引腳的讀數」*如果Raspi沒有內置模數轉換器(ADC),您如何讀取電位計?外部ADC?窮人的ADC(電容+電阻)?還有別的嗎? – jDo

回答

1

是的,你可以做到這一點 - 你需要看的是線程

這可能是一個相當困難的任務(不確定您的編程級別) - 它還取決於您希望如何顯示信息。

PyQt5對於運行多個線程並在通用GUI界面中輸出顯示有很好的支持,如果你不打算使用GUI(並且我猜你不會),那麼你需要看看原生線程模塊。

0

作爲一個設計問題,如果你想要在ROS中工作,我不會推薦將它們組合起來。原因是ROS節點應該執行一個特定且最簡單的任務,如ROS Nodes wiki所解釋的那樣。所以在你的情況下,一個閱讀和其他控制,很好。

另一方面,如果你真的把它們合併起來,你可以使用Tim的建議。多線程是一個很好的解決方案。所以,你必須實現兩個線程單獨工作,可能共享一個deque,從GPIO讀取的數據使用.push_back,驅動使用.pop_front

相關問題