How to access a ros message in a launch file?
Hello Is it possible to access a ros message in a launch file and based on the value of the message publish to another topic? Moreor like a conditional statement. I checked online and seems no method to access the ros messages in a launch file.
#!/usr/bin/env python3
import roscompatibility as roscomp from roscompatibility.node import CompatibleNode from ros_compatibility.qos import QoSProfile, DurabilityPolicy
from carlamsgs.msg import CarlaEgoVehicleStatus from racomm.msg import DriverWish import rospy
import sys
class RAssistCondition(CompatibleNode):
def __init__(self):
"""
Constructor
"""
super(RAssistCondition, self).__init__("ra_assist_condition")
self.role_name = self.get_param("role_name", "ego_vehicle")
self.driver_wish_pub = rospy.Publisher('/ra/core/smach/driver_wish', DriverWish, queue_size=10)
self.new_subscription(
CarlaEgoVehicleStatus,
"/carla/{}/vehicle_status".format(self.role_name),
self.racondition,
qos_profile=QoSProfile(depth=1, durability=DurabilityPolicy.TRANSIENT_LOCAL))
self.published = False
def racondition(self, vehicle_status):
if not vehicle_status.velocity: # pylint: disable=no-member
self.logerr("Cannot determine the vehicle velocity")
sys.exit(1)
self.vehicle_velocity = vehicle_status.velocity
self.logerr("Vehicle velocity info received. velocity={}".format(self.vehicle_velocity))
if (self.vehicle_velocity > 0) and not self.published:
try:
self.pubDriverWish()
self.published = True
self.logerr("publishing driver wish")
except:
self.logerr("Vehicle velocity info received. velocity={}".format(self.vehicle_velocity))
self.logerr("Error while publishing driver wish")
# publish function
def pubDriverWish(self):
curr_ts = rospy.Time.now()
self.logerr("publishing driver wish")
rospy.loginfo('[Display] Publish driver wish')
msg = DriverWish()
msg.Header.stamp = curr_ts
msg.driver_wish = True
self.driver_wish_pub.publish(msg)
def main(args=None): """ main function
:return:
"""
roscomp.init("ra_assit_condition", args)
ra_assit_condition = None
rospy.sleep(15)
try:
ra_assit_condition = RAssistCondition()
ra_assit_condition.spin()
rospy.logerr("Condition for reverse assist")
except KeyboardInterrupt:
pass
finally:
if ra_assit_condition is not None:
ra_assit_condition.logerr("Done, deleting twist to control")
del ra_assit_condition
roscomp.shutdown()
if name == 'main':
main()
Asked by ros5853 on 2023-08-01 09:48:13 UTC
Answers
Hello,
I would say this is not the way to proceed. A launch file is just an xml description of nodes to start, parameters to load, ... You cannot wait for a message
or decide depending on the value
.
It seems to me that what you want to achieve needs to write a node which can then listen for a message and decide whether or not to publish to another topic. This node you would write could be included in your launch.
Asked by Jeremy Fix on 2023-08-02 02:12:57 UTC
Comments
Thanks for the answer. I am a begineer in ROS and my scenario is that I have to subscribe to a topic which has a message. Based on the message value i have to publish to an already existing topic. So in this scenario, what may be the best method to proceed? Create a node like you said ?
Asked by ros5853 on 2023-08-02 02:25:07 UTC
Definitely, you must write a subscriber/publisher node. Either in C++ or python.
Have a look to the tutorials http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28python%29 , these are really great resources, especially when you begin.
Asked by Jeremy Fix on 2023-08-02 02:34:31 UTC
I used the above links to create a node in python as a package. I then used the node in a launch file and i can see it in the list of nodes. But the commands in the node is not executing. The commands are to publish to a topic. I also put all the loginfo but none of them is displaying in CLI. How does happen? The connection of the node in rqt is also the same as i needed. I added the code in the question.
Asked by ros5853 on 2023-08-02 06:15:24 UTC
Oh, wait; Can you be more accurate on the exact versions of ROS you are using ?
You tagged it ROS1 but then you are using the ros_bridge ; Do you need ROS1 or are you running ROS2 ?
By the way, one comment on the submitted code : you should not create a new instance of rospy publisher in the callback racondtion but you should create it once for all in the constructor
Also, once you ran your code, did you try to submit a message to the /carla/ego_vehicle/vehicle_status
topic from the command line ? Like "ros2 topic pub /carla/ego_vehicle/vehicle_status carla_msgs/msg/CarlaEgoVehicleStatus {'velocity': 1}"
Asked by Jeremy Fix on 2023-08-02 13:32:09 UTC
Yes, It is working with ROS1. You mean to include the 'driver_wish_pub' in the constructor, rather than in the racondition? And where can i give the conditon to check whether to execute. I also edited the code little bit and uploaded.
Now I have one problem which i was not understanding:
The self.velocity_status checking condition is not followed. The messages are published even it is less than zero
Asked by ros5853 on 2023-08-03 01:57:07 UTC
Comments