7.3 A hello world example!
Communicating between threads in URScript should not generally be done using ROS 2, as the overhead makes it incredibly inefficient. It does however make a good example for how to use ROS 2 in URScript.
Hello World
global iter = 0
# A thread responsible for sending messages
thread publish():
# Prepare a handle for a topic, that can be used to send messages. The name is test, and the type is std_msgs/String
pub_handle = ros_publisher_factory(topic="test", msg_type="std_msgs/String", history="keep_last", depth=100, durability="transient_local")
while(True):
msg = str_cat("Hello world ",iter)
pub_handle.write(struct(data=msg))
iter = iter + 1
textmsg(str_cat("Published ", msg))
sleep(0.5)
end
end
myPublisher = run publish()
thread readOneItem():
sub_handle = ros_subscriber_factory(topic="test", msg_type="std_msgs/String")
sleep(3)
while (True):
value = sub_handle.read() # This read will block until something is available
textmsg(str_cat("Read 1 item: ",value))
end
end
myReadOneItem = run readOneItem()
# Insert any other threads you want to use here above the join
join myReadOneItem # Avoid the main thread exiting
To experiment with accessing the ROS 2 history, the following two threads can added to the above program. Make sure to add it before the join line.
Observe that the subscriber handles operate independently. A read from one handle will not affect the history of the others.
More Subscribers
# This thread will repeatedly try to read 10 items from the topics history.
thread subscribe_history():
sub_handle = ros_subscriber_factory(topic="test", msg_type="std_msgs/String", history="keep_last", depth=100, durability="transient_local")
sleep(3)
while (True):
value = sub_handle.read_history(10) # Read 0-10 items from the history, depending on how many are available
textmsg(str_cat("Read 10 history items: ",value))
waittime = (iter % 10)/2.0 # Wait for a pseudo random amount of time, to see how the read reacts to different history sized
sleep(waittime)
end
end
mySubscriber = run subscribe_history()
thread subscribe2():
# This subhandle only has a history depth of 1, and thus at most one message will ever be returned by read_history
sub_handle = ros_subscriber_factory(topic="test", msg_type="std_msgs/String", history="keep_last", depth=1, durability="transient_local")
sleep(3)
while (True):
value = sub_handle.read_history(1) # Read one message from
if length(value)>0: # We are not guaranteed any items will be read
textmsg(str_cat("Read 1 history items: ",value[0]))
end
waittime = (iter % 10)/2.0
sleep(waittime)
end
end
mySubscriber2 = run subscribe2()
Try playing around with history depth, waits and other parameters to gain a better understanding of the ROS 2 functionality.