
Некоторое время назад стал использовать ROS, CaptainTrunky написал отличную статью Основы работы с Robotic Operating System, поэтому мы приступим сразу к практике.
Введение
В примере будет использован rospy. Аппаратная часть состоит из OR-AVR-M128-DS и usb-uart моста.
Характеристики:
Микроконтроллер: ATMega128 @ 7.3728 МГц
Порты RoboGPIO: 16 (8 с АЦП)
Порты RoboI2C: 6
Порты сервоприводов: 16
Разъемы двигателей: 2
Контроллер с ORFA на борту. Ниже приведена схема, иллюстрирующая взаимодействие с портами.
Практика
Создаем узел serial_node и слушаем публикации в теме serial.
rospy.init_node('serial_node')
rospy.Subscriber('serial', String, sci.callback)
rospy.spin()
Когда кто-то опубликует сообщение в теме serial, будет вызван метод callback(в нашем случае).
def callback(self, data):
if data.data[0] == 'V':
self.getVersion()
elif data.data[0] == 'L':
self.setL(data.data[1:3])
Метод getVersion() запрашивает версию ORFA, метод setL() устанавливает I2C адрес контроллера.
def getVersion(self):
self.write('V')
print self.read(4)
def setL(self, iic):
self.write('L' + iic)
print self.read(3)
Для тестирования ноды был написан test.py, который публикует в топик serial введенную строку.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import roslib; roslib.load_manifest('or_serial')
import rospy
from std_msgs.msg import String
serial = rospy.Publisher('serial', String)
rospy.init_node('serial')
r = rospy.Rate(10)
while not rospy.is_shutdown():
cmd = raw_input('Enter cmd: ')
serial.publish(cmd)
r.sleep()
Запуск
Теперь надо все это запустить. Открываем терминал,
$roscore

Далее открываем еще один терминал, запускаем написанную ноду. У метя так:
$rosrun or_serial serial_node.py
В третьем терминале запускаем наш test.py:
$rosrun or_serial test.py
Проверяем — все работает.


Ну и напоследок граф связей.
$rxgraph

На нем видно, как serial_node слушает топик serial, а нода serial публикует сообщения в топик serial.
Спасибо всем дочитавшим до конца.