我们希望使用从连接到Raspberry pi 2上的GPIO引脚的电位计获得的值来控制P3DX机器人。目前我们有两个 Python 文件:一个用于移动机器人,另一个用于读取连接到电位计的 GPIO 引脚。这两个文件已经在独立工作。但是是否可以将两个文件合并为一个文件并运行它?因为我认为与 ROS 接口的 Python 文件需要单独运行。如果没有,实现我们想要做的事情的最简单方法是什么?
***更新:从本质上讲,我们试图使用悬链线方法来移动两个编队的机器人。因此,我们要测量电位器与绳子的角度,其中另一端连接到另一个机器人。根据角度,它给出了机器人的方向,然后我们可以进行适当的调整,将机器人重新对齐到中心线,以便机器人跟随前面的第一个机器人。
我们点击了此链接,了解如何将电位计连接到树莓派 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忽略音量的东西,我们没有包括它们。只是看锅。
是的,你可以这样做 - 你需要研究的是线程。
这可能是一项相当困难的任务(不确定您的编程水平) - 这也取决于您希望如何显示信息。
PyQt5 对运行多个线程和在通用 Gui 界面中输出显示有非常好的支持,如果你不打算使用 GUI(在 Raspberry 上,我想你不会),那么你需要看看原生线程模块。
作为一个设计问题,如果你想让它在 ROS 中工作,我不建议将它们组合在一起。原因是 ROS 节点应该有一个特定的、最简单的任务来执行,如 ROS 节点 wiki 中所述。所以在你的情况下,一个阅读,另一个控制,很好。
在另一部分,如果你真的把它们结合起来,你可以使用蒂姆的建议。多线程是一个很好的解决方案。因此,您必须实现两个单独工作的线程,并且可能共享一个 deque,从 GPIO 读取的线程使用.push_back
,而驱动器使用.pop_front
。