Python 使用Raspberry Pi 2 B型上的GPIO引脚控制P3DX机器人运行ROS

Python 使用Raspberry Pi 2 B型上的GPIO引脚控制P3DX机器人运行ROS,python,raspberry-pi2,gpio,ros,Python,Raspberry Pi2,Gpio,Ros,我们希望使用从连接到Raspberry pi 2上GPIO引脚的电位计获得的值来控制P3DX机器人。目前我们有两个Python文件:一个用于移动机器人,另一个用于读取连接到电位计的GPIO引脚。这两个文件都已独立工作。但是,是否可以将这两个文件合并为一个文件并运行它?因为我认为与ROS接口的Python文件需要单独运行。如果没有,实现我们想要做的事情最简单的方法是什么 ***更新: 本质上,我们正在尝试使用悬链线方法来移动两个编队的机器人。所以我们想测量电位计与绳子的夹角,绳子的另一端与另一个机

我们希望使用从连接到Raspberry pi 2上GPIO引脚的电位计获得的值来控制P3DX机器人。目前我们有两个Python文件:一个用于移动机器人,另一个用于读取连接到电位计的GPIO引脚。这两个文件都已独立工作。但是,是否可以将这两个文件合并为一个文件并运行它?因为我认为与ROS接口的Python文件需要单独运行。如果没有,实现我们想要做的事情最简单的方法是什么

***更新: 本质上,我们正在尝试使用悬链线方法来移动两个编队的机器人。所以我们想测量电位计与绳子的夹角,绳子的另一端与另一个机器人相连。根据角度,它给出机器人的方向,然后我们可以进行适当的调整,将机器人重新对准中心线,使机器人跟随前面的第一个机器人

我们遵循这个链接,了解如何将电位计连接到Raspberry Pi 2并读取值。它还包括脚本文件:

以下是用于移动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()
#/usr/bin/env python
导入getch
进口roslib;roslib.load_清单('p3dx_mover'))
进口罗西
从几何体\u msgs.msg导入扭曲
键向上=65
按键向下=66
右键=67
左键=68
用户退出=100
最大向前=1.1
最大左=0.3
最小向前=-1.1
最小左=-0.3
正向=0.0
左=0.0
按键=0
while(按键!=用户退出):
pub=rospy.Publisher('RosAria/cmd_vel',Twist)
rospy.init_节点('p3dx_mover'))
twist=twist()
keyPress=getch.getArrow()
如果((按键==向上键)和(向前=最小向前键)):
正向-=0.1
elif((按键=左键)和(左键=左最小值)):
左-=0.1
扭曲。线性。x=向前
扭曲角度z=左
发布(twist)
pub=rospy.Publisher('RosAria/cmd_vel',Twist)
rospy.init_节点('p3dx_mover'))
twist=twist()
发布(twist)
退出()
` 这是我们用来读取电位计电压电平值的链接:
忽略音量,我们没有包括它们。只要读一下锅就可以了。

是的,你可以做到这一点——你需要研究的是线程

这可能是一项相当困难的任务(不确定您的编程级别)-它还取决于您希望如何显示信息


PyQt5对运行多线程和在通用Gui界面中输出显示有很好的支持,如果您不打算使用Gui(在覆盆子上,我想您不会),那么您需要查看本机线程模块。

作为一个设计问题,如果您希望在ROS中工作,我不建议把它们结合起来。原因是ROS节点应该有一个特定的、最简单的任务来执行,如上所述。所以在你的情况下,一个读数,另一个控制,很好


在另一部分,如果你真的想把它们结合起来,你可以使用蒂姆建议的方法。多线程是一个很好的解决方案。因此,您必须实现两个线程分别工作,并且可能共享一个,一个从GPIO读取的线程使用一个
。push_back
,另一个驱动线程使用一个
。pop_front

欢迎使用堆栈溢出!欢迎来到Stackoverflow!你能详细说明你的问题吗?用你的努力,比如代码或者其他什么,这样人们就能尽早发现你的问题并帮助你?谢谢1) 请展示您的代码(或一个简单的示例)。否则,这就太宽泛了。然而,真正的问题归结到这一点——您是否需要这两个操作连续进行,彼此独立?无论哪种方式,都可以将其合并到一个程序/文件中。但是,如果您需要它们独立运行而不相互阻塞,我们可能需要一些多处理!“读取连接到电位计的GPIO引脚的一个”如果Raspi没有内置的模数转换器(ADC),您如何读取电位计?外部模数转换器?穷人的ADC(电容器+电阻器)?还有别的吗?@Will我发布了我们正在使用的代码。是的,它需要连续运行。我假设它们相互依赖,因为我们想要使用电位计值作为输入来移动机器人。我们正试图用绳子测量电位计的角度。根据角度,它给出机器人的方向,然后我们可以进行适当的调整,将机器人重新对准中心线。@jDo我们使用MCP3008作为外部ADC芯片,将电位计的数据传输到Raspberry Pi 2。