Используйте вывод GPIO на Raspberry Pi 2 Model B для управления роботом P3DX, работающим под управлением ROS

Мы хотим управлять роботом P3DX, используя значения, полученные от потенциометра, подключенного к выводу GPIO на Raspberry pi 2. В настоящее время у нас есть два файла Python: один, который перемещает робота, и другой, который считывает вывод GPIO, подключенный к потенциометру. Оба файла уже работают самостоятельно. Но можно ли объединить два файла в один и запустить его? Потому что я думал, что файл Python, взаимодействующий с ROS, нужно будет запускать отдельно. Если нет, то как проще всего реализовать то, что мы хотим сделать?

*** Обновление: по сути, мы пытаемся использовать цепной метод для перемещения двух роботов в строю. Итак, мы хотим измерить угол, который потенциометр образует с веревкой, другой конец которой прикреплен к другому роботу. В зависимости от угла он определяет ориентацию робота, а затем мы можем внести соответствующие корректировки, чтобы выровнять робота по центральной линии, чтобы робот следовал за первым роботом впереди.

Мы прошли по этой ссылке, чтобы узнать, как подключить потенциометр к 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 Не обращайте внимания на объемные вещи, мы их не включали. Просто читаю горшок.


person Adrian    schedule 17.03.2016    source источник
comment
Добро пожаловать в Stack Overflow! Добро пожаловать в Stackoverflow! Не могли бы вы уточнить свой вопрос, приложив усилия, например, код или что-то в этом роде, чтобы люди могли решить вашу проблему как можно раньше и помочь вам? Спасибо!   -  person Enamul Hassan    schedule 17.03.2016
comment
1) Покажите, пожалуйста, свой код (или простой пример того, что вы делаете). В противном случае это слишком широко. Однако настоящая проблема сводится к следующему - нужно ли вам, чтобы обе эти операции выполнялись непрерывно, независимо друг от друга? В любом случае вы можете объединить это в одну программу / файл. Однако, если вам нужно, чтобы они работали независимо, не блокируя друг друга, нам может потребоваться некоторая многопроцессорность!   -  person Will    schedule 17.03.2016
comment
тот, который считывает вывод GPIO, подключенный к потенциометру Как вы читаете потенциометр, учитывая, что Raspi не имеет встроенного аналого-цифрового преобразователя (АЦП)? Внешний АЦП? Бедный АЦП (конденсатор + резистор)? Что-то другое?   -  person jDo    schedule 17.03.2016
comment
@ Я выложил код, который мы используем. Да, он должен работать постоянно. Я предполагаю, что они зависят друг от друга, поскольку мы хотим использовать значения потенциометра в качестве входных данных для перемещения робота. Мы пытаемся измерить угол, который потенциометр делает с веревкой. В зависимости от угла он определяет ориентацию робота, а затем мы можем внести соответствующие корректировки, чтобы выровнять робота по центральной линии.   -  person Adrian    schedule 17.03.2016
comment
@jDo Мы используем MCP3008 в качестве внешнего чипа АЦП для передачи данных от потенциометра на Raspberry Pi 2.   -  person Adrian    schedule 17.03.2016


Ответы (2)


Да, вы можете это сделать. И вам нужно изучить многопоточность.

Это может быть довольно сложной задачей (не уверен в вашем уровне программирования) - это также зависит от того, как вы хотите отображать информацию.

PyQt5 имеет ОЧЕНЬ хорошую поддержку для запуска нескольких потоков и вывода изображения в общем интерфейсе Gui, если вы не планируете использовать графический интерфейс (и на Raspberry, я думаю, вы этого не сделаете), вам нужно посмотреть на собственный модуль threading.

person Tim Seed    schedule 17.03.2016

Что касается дизайна, если вы хотите, чтобы это работало в ROS, я не рекомендую объединять их. Причина в том, что узлы ROS должны иметь конкретную и простейшую задачу для выполнения, как описано в вики по узлам ROS. . Так что в вашем случае одно чтение, а другое контролирующее, хорошо.

С другой стороны, если вы действительно хотите объединить их, вы можете использовать то, что предложил Тим. Многопоточность - хорошее решение. Итак, вам нужно реализовать два потока, работающих отдельно и, возможно, совместно использовать двухстороннюю очередь, одно чтение из GPIO использует .push_back, а тот, кто управляет, использует .pop_front.

person Vtik    schedule 17.03.2016