ПРОДОЛЖЕНИЕ и ОКОНЧАНИЕ Создание проекта в ROS, написание subscriber для получения сообщений из узла rosserial и запуска сервисов irobot_create_2_1 — начало здесь далее здесь и еще здесь
Создаем новый проект vp_arduino1
cd ~/ros_pkgs roscreate-pkg vp_arduino1 std_msgs rospy
Cоздадим файл сообщений Arduino1.msg. Для этого создадим в директории нашего пакета папку msg и в ней файл Arduino1.msg. Файл наполним следующим содержанием:
int16 var1 int16 var2 int16 var3 int16 var4 int16 var5
Установка системы зависимостей и сборка пакета
rosdep install vp_arduino1 rosmake vp_arduino1
Пакет собран.
Теперь пишем код для subscriber на python
Получая сообщения анализируем первый параметр и запускаем сервисы пакета irobot_create
Создаем файл node_arduino_1_1.py:
roscd vp_aruino1 mkdir nodes cd nodes touch node_arduino_1_1.py
Содержимое файла
#!/usr/bin/env python
import roslib; roslib.load_manifest('vp_arduino1')
import rospy
import irobot_create_2_1
from vp_arduino1.msg import Arduino1
from irobot_create_2_1.srv import *
def callback(data):
rospy.loginfo(rospy.get_name()+"Params %s %s %s %s %s"%(data.var1,data.var2,data.var3,data.var4,data.var5))
if data.var1==139:
rospy.wait_for_service('leds')
try:
srvLeds = rospy.ServiceProxy('leds', Leds)
resp1 = srvLeds(data.var2,data.var3,data.var4,data.var5)
print resp1.success
except rospy.ServiceException, e:
print "Service Led failed: %s"%e
elif data.var1==136:
rospy.wait_for_service('demo')
try:
srvDemo = rospy.ServiceProxy('demo', Demo)
resp1 = srvDemo(data.var2)
print resp1.success
except rospy.ServiceException, e:
print "Service Demo failed: %s"%e
elif data.var1==128:
rospy.wait_for_service('break')
try:
srvBreak = rospy.ServiceProxy('break', Break)
resp1 = srvBreak(data.var2)
print resp1.success
except rospy.ServiceException, e:
print "Service Break-start failed: %s"%e
elif data.var1==145:
rospy.wait_for_service('tank')
try:
srvTank = rospy.ServiceProxy('tank', Tank)
resp1 = srvTank(1,data.var3,data.var4)
print "%s %s %s"%(resp1.success,data.var3,data.var4)
except rospy.ServiceException, e:
print "Service Tank failed: %s"%e
else:
print "not Services"
def listener():
rospy.init_node('listener', anonymous=True)
rospy.Subscriber("Theme_arduino1", Arduino1, callback)
rospy.spin()
if __name__ == '__main__':
listener()
И теперь запускаем робота
Первый терминал
roscore
Второй терминал
rosrun rosserial_python serial_node.py /dev/ttyUSB0
Получаем список тем (топиков)
rostopic list
Список
/Theme_arduino1 /rosout /rosout_agg
Выдача сообщений в топик Theme_arduino1
rostopic echo Theme_arduino1
при посылке из Android-устройства видим
var1: 139 var2: 8 var3: 153 var4: 170 var5: 180 --- var1: 145 var2: 0 var3: 100 var4: 0 var5: 0 --- var1: 145 var2: 0 var3: 50 var4: 255 var5: 156
Третий терминал — запуск драйвера irobot_create_2_1
rosparam set /brown/irobot_create_2_1/port /dev/ttyACM0 rosrun irobot_create_2_1 driver.py
Четвертый терминал — запуск subscriber
rosrun vp_arduino1 node_arduino_1_1.py
И получение сообщений при посылке из Android-устройства
Результат наблюдаем в терминале [INFO] [WallTime: 1348674186.519380] /listener_7319_1348674183862Params 139 8 153 170 156 [INFO] [WallTime: 1348674194.157557] /listener_7319_1348674183862Params 145 0 0 0 0 [INFO] [WallTime: 1348674197.132703] /listener_7319_1348674183862Params 145 255 56 0 0 [INFO] [WallTime: 1348674200.168712] /listener_7319_1348674183862Params 145 254 162 0 0 [INFO] [WallTime: 1348674203.193468] /listener_7319_1348674183862Params 145 255 6 255 56 [INFO] [WallTime: 1348674206.212403] /listener_7319_1348674183862Params 145 254 212 254 212 [INFO] [WallTime: 1348674209.231324] /listener_7319_1348674183862Params 145 255 106 0 100 [INFO] [WallTime: 1348674212.261905] /listener_7319_1348674183862Params 145 0 200 0 0
И результат — видео
