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

时间:2016-03-17 01:10:30

标签: python raspberry-pi2 gpio ros

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

***更新: 基本上我们试图使用悬链线方法移动两个机器人。所以我们想测量电位器用绳子做的角度,其中另一端连接到另一个机器人。根据角度,给出机器人的方向,然后我们可以进行适当的调整,使机器人重新对准中心线,使机器人跟随前面的第一个机器人。

我们按照此链接介绍了如何将电位计连接到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 忽略音量,我们没有包含它们。刚看完锅。

2 个答案:

答案 0 :(得分:1)

是的,你可以这样做 - 你需要研究的是线程

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

PyQt5非常支持运行多个线程并在常见的Gui界面中输出显示,如果你不打算使用GUI(在Raspberry上,我猜你不会),那么你需要查看本机线程模块。

答案 1 :(得分:0)

作为一个设计问题,如果你想在ROS中使用它,我不建议将它们组合在一起。原因是ROS节点应该具有特定且最简单的可执行任务,如ROS Nodes wiki所述。所以在你的情况下,一个阅读和另一个控制,罚款。

在另一部分中,如果你真的要将它们合并,你可以使用蒂姆建议的内容。多线程是一个很好的解决方案。因此,您必须实现两个独立工作的线程,并且可能共享deque,从GPIO读取的一个使用.push_back,驱动者使用.pop_front