Skip to content

Commit

Permalink
update launch files
Browse files Browse the repository at this point in the history
  • Loading branch information
InvincibleRMC committed Apr 16, 2024
1 parent 3f29dc9 commit f4a28dc
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 23 deletions.
15 changes: 11 additions & 4 deletions config/pub.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
demo_bridge_pub:
mqtt_ros_bridge:
ros__parameters:
pub1:
topic: "hi"

turtle_pub:
topic: "/turtle1/cmd_vel"
type: "geometry_msgs.msg:Twist"
publish_on_ros: True

yippee:
topic: "foo"
type: "std_msgs.msg:String"
publish_on_ros: True
use_ros_serializer: True
11 changes: 9 additions & 2 deletions launch/demo_pub.py → launch/demo_pub_launch.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,20 @@ def generate_launch_description() -> LaunchDescription:
run_bridge_node = Node(
package='mqtt_ros_bridge',
executable='bridge_node',
name='demo_bridge_pub',
emulate_tty=True,
output='screen',
parameters=[config]
)

turtle_sim = Node(
package='turtlesim',
executable='turtlesim_node',
emulate_tty=True,
output='screen'
)

return LaunchDescription([
SetEnvironmentVariable("ROS_DOMAIN_ID", "2"),
run_bridge_node
run_bridge_node,
turtle_sim
])
File renamed without changes.
53 changes: 36 additions & 17 deletions mqtt_ros_bridge/bridge_node.py
Original file line number Diff line number Diff line change
@@ -1,45 +1,55 @@
from dataclasses import dataclass
from typing import Any, Callable, Generic

import paho.mqtt.client as MQTT
import rclpy

from rclpy._rclpy_pybind11 import RMWError
from rclpy.node import Node
from rclpy.publisher import Publisher

from mqtt_ros_bridge.msg_typing import MsgLikeT
from mqtt_ros_bridge.serializer import ROSDefaultSerializer, Serializer
from mqtt_ros_bridge.serializer import (JSONSerializer, ROSDefaultSerializer,
Serializer)
from mqtt_ros_bridge.util import lookup_object


@dataclass
class TopicInfo(Generic[MsgLikeT]):
"""Metadata about a single topic."""

name: str
msg_type: type[MsgLikeT]
# Should Serializer also be generic across MsgLikeT?
serializer: type[Serializer]
publish_on_ros: bool
def __init__(self, name: str, msg_object_path: str,
publish_on_ros: bool, use_ros_serializer: bool = True) -> None:

self.name = name
self.msg_type = lookup_object(msg_object_path)
self.publish_on_ros = publish_on_ros

if use_ros_serializer:
self.serializer: type[Serializer] = ROSDefaultSerializer
else:
self.serializer = JSONSerializer


TOPICS: dict[str, TopicInfo] = {
'/turtle1/cmd_vel': TopicInfo('/turtle1/cmd_vel', lookup_object("std_msgs.msg:String"),
ROSDefaultSerializer, False),
# 'sub_topic': TopicInfo('sub_topic', String, ROSDefaultSerializer, False)
}
# TOPICS: dict[str, TopicInfo] = {
# '/turtle1/cmd_vel': TopicInfo('/turtle1/cmd_vel', "std_msgs.msg:String", False),
# # 'sub_topic': TopicInfo('sub_topic', String, ROSDefaultSerializer, False)
# }

MQTT_PORT = 1883
MQTT_KEEPALIVE = 60

PARAMETER_TOPIC = "topic"
PARAMETER_TYPE = "type"
PARAMETER_PUBLISH_ON_ROS = "publish_on_ros"
PARAMETER_USE_ROS_SERIALIZER = "use_ros_serializer"


class BridgeNode(Node):
"""Node to bridge MQTT and ROS."""

def __init__(self) -> None:
super().__init__('mqtt_bridge_node')

self.topics = self.topic_info_from_parameters()

# TODO get from parameters
DEBUG = True

Expand All @@ -52,8 +62,7 @@ def __init__(self) -> None:

self.ros_publishers: dict[str, Publisher] = {}

for topic_info in TOPICS.values():
print(topic_info.msg_type)
for topic_info in self.topics.values():
if topic_info.publish_on_ros:
publisher = self.create_publisher(topic_info.msg_type, topic_info.name, 10)
self.ros_publishers[topic_info.name] = publisher
Expand All @@ -65,6 +74,16 @@ def __init__(self) -> None:

self.mqtt_client.on_message = self.mqtt_callback

def topic_info_from_parameters(self) -> dict[str, TopicInfo]:
dictionary = {}

params = self.get_parameters_by_prefix('')

self.get_logger().info(str(params))

return dictionary


def make_ros_callback(self, topic_info: TopicInfo[MsgLikeT]) -> Callable[[MsgLikeT], None]:
"""
Create a callback function which re-publishes messages on the same topic in MQTT.
Expand Down Expand Up @@ -96,7 +115,7 @@ def mqtt_callback(self, _client: MQTT.Client,
the message received over MQTT
"""
topic_info = TOPICS[mqtt_msg.topic]
topic_info = self.topics[mqtt_msg.topic]

self.get_logger().info(
f'MQTT RECEIVED: Topic: "{topic_info.name}" Payload: "{mqtt_msg.payload!r}"')
Expand Down

0 comments on commit f4a28dc

Please sign in to comment.