Странное поведение при получении сообщения ROS - PullRequest
0 голосов
/ 19 сентября 2018

Я вожу светодиоды с помощью сообщений ros.Я написал код Python, который управляет приемом сообщений и управляет светодиодами WS2812

Я использую rpi_ws281x для управления светодиодами (https://github.com/jgarff/rpi_ws281x).

Вот код Python:

#!/usr/bin/env python

from neopixel import *
from ina219 import INA219
from ina219 import DeviceRangeError
import rospy
from std_msgs.msg import String
import json
import simplejson

def updateLeds(leds):
    for index, item in enumerate(leds):
        print(index, item)
        strip.setPixelColor(index, item)
    strip.show()

def updateLed(led, color):
    strip.setPixelColor(led, color)

rospy.loginfo("Initializing leds")

# LED strip configuration:
LED_COUNT      = 4      # Number of LED pixels.
LED_PIN        = 10      # GPIO pin connected to the pixels 
LED_FREQ_HZ    = 800000  # LED signal frequency in hertz (usually 800khz)
LED_DMA        = 10      # DMA channel to use for generating signal (try 10)
LED_BRIGHTNESS = 40     # Set to 0 for darkest and 255 for brightest
LED_INVERT     = False   # True to invert the signal (when using NPN transistor level shift)
LED_CHANNEL    = 0       # set to '1' for GPIOs 13, 19, 41, 45 or 53

rospy.init_node('leds_listener', anonymous=True)

rospy.loginfo("Initializing leds")

# Create NeoPixel object with appropriate configuration.
strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL)
# Intialize the library (must be called once before other functions).
strip.begin()

strip.setPixelColor(0, Color(255, 0, 0))    #GRB
strip.setPixelColor(1, Color(0, 255, 0))
strip.setPixelColor(2, Color(0, 0, 255))
strip.setPixelColor(3, Color(255, 255, 0))
strip.show()

ledColors = [Color(0, 0, 0), Color(0, 0, 0), Color(0, 0, 0), Color(0, 0, 0)]
updateLeds(ledColors)

rospy.loginfo("Initializing leds ok")

def callback(data):
    rospy.loginfo(rospy.get_caller_id() + 'I heard %s', data.data)
    try:
        #parse the json
        jsonData = simplejson.loads(data.data)
        #check the mode 
        if jsonData["mode"].lower() == "basic":
            led = int(jsonData["values"]["led"])
            color = int(jsonData["values"]["color"], 16)
            print("led:", led, "color", color)
            ledColors[led] = color
            #updateLeds(ledColors)
            updateLed(led, color)
            strip.show()

    except ValueError as e:
            rospy.logerr("Unable to parse json input ( %s ): %s", data.data, e)

def leds_listener():

    rospy.Subscriber('leds', String, callback)
    # spin() simply keeps python from exiting until this node is stopped
    rospy.spin()

if __name__ == '__main__':
    try:
        leds_listener()
    except rospy.ROSInterruptException:
        pass

Вот сообщение json в виде строки

#examples of valid message
{
    "mode" : basic,
    "values" : { 
        "led" : "0",
        "color" : "FF0033"
    }
}

Я отправляю сообщение через rostopic, используя следующую строку:

export MY_MSG="data: '{\"values\": {\"color\": \"00FF00\", \"led\": \"1\"}, \"mode\": \"basic\"}'";rostopic pub -1 leds std_msgs/String "$MY_MSG"

И это хорошо работает.

НоТеперь я хотел бы отправлять его периодически, поэтому я использую следующую строку запятой:

export MY_MSG="data: '{\"values\": {\"color\": \"00FF00\", \"led\": \"1\"}, \"mode\": \"basic\"}'";rostopic pub -r 0.2 leds std_msgs/String "$MY_MSG"

И программа показывает мне тот же вывод журнала, но поведение действительно другое. Вместо того, чтобы правильно приводить светодиод, все светодиоды идутдо белого при максимальном значении.

В чем разница между периодическим отправлением сообщения?

...