使用树莓派 2 型号 B 上的 GPIO 引脚来控制运行 ROS 的 P3DX 机器人



我们希望使用从连接到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

最新更新