Skip to content

xmlrpc ResponseError when echoing topics with ros:humble containers #761

@civerachb-cpr

Description

@civerachb-cpr

I've got a Humble docker container that's raising xmlrpc.client.ResponseError errors when I try to echo topics. It doesn't make any difference if the topics are published inside or outside the container.

This started happening on July 3; prior to that topics appeared to echo correctly. I see there was a new release on or around July 2, so depending on the exact timing of when that release was made available and when I built the first image to exhibit this error it could be related? I definitely was able to echo topics properly with images made early in the morning (EDT) on July 2, but since pulling the latest ros:humble image things seem to have broken.

Exception details:

$ docker exec -it ${CONTAINER_HASH} bash
root@HOST:/# source ros_entrypoint.sh 
root@HOST:/# ros2 topic echo /test
Traceback (most recent call last):
  File "/opt/ros/humble/bin/ros2", line 33, in <module>
    sys.exit(load_entry_point('ros2cli==0.18.10', 'console_scripts', 'ros2')())
  File "/opt/ros/humble/lib/python3.10/site-packages/ros2cli/cli.py", line 91, in main
    rc = extension.main(parser=parser, args=args)
  File "/opt/ros/humble/lib/python3.10/site-packages/ros2topic/command/topic.py", line 41, in main
    return extension.main(args=args)
  File "/opt/ros/humble/lib/python3.10/site-packages/ros2topic/verb/echo.py", line 220, in main
    qos_profile = self.choose_qos(node, args)
  File "/opt/ros/humble/lib/python3.10/site-packages/ros2topic/verb/echo.py", line 146, in choose_qos
    pubs_info = node.get_publishers_info_by_topic(args.topic_name)
  File "/usr/lib/python3.10/xmlrpc/client.py", line 1122, in __call__
    return self.__send(self.__name, args)
  File "/usr/lib/python3.10/xmlrpc/client.py", line 1464, in __request
    response = self.__transport.request(
  File "/usr/lib/python3.10/xmlrpc/client.py", line 1166, in request
    return self.single_request(host, handler, request_body, verbose)
  File "/usr/lib/python3.10/xmlrpc/client.py", line 1182, in single_request
    return self.parse_response(resp)
  File "/usr/lib/python3.10/xmlrpc/client.py", line 1348, in parse_response
    p.feed(data)
  File "/usr/lib/python3.10/xmlrpc/client.py", line 451, in feed
    self._parser.Parse(data, False)
  File "../Modules/pyexpat.c", line 416, in StartElement
  File "/usr/lib/python3.10/xmlrpc/client.py", line 689, in start
    raise ResponseError("unknown tag %r" % tag)
xmlrpc.client.ResponseError: ResponseError("unknown tag 'rclpy.type_hash.TypeHash'")

The /test topic above was generated with ros2 topic pub inside the container:

$ docker exec -it ${CONTAINER_HASH} bash
root@HOST:/# source /ros_entrypoint.sh 
root@HOST:/# ros2 topic pub /test std_msgs/String 'data: "This is a test"' -r 1
publisher: beginning loop
publishing #1: std_msgs.msg.String(data='This is a test')
...

Docker build files, and relevant files included in volumes are below:

Dockerfile:

FROM ros:humble

# Add ROS 2 testing server (create3 republisher is not on main yet)
RUN echo "deb [ signed-by=/usr/share/keyrings/ros2-latest-archive-keyring.gpg ] http://packages.ros.org/ros2-testing/ubuntu jammy main" > /etc/apt/sources.list.d/ros2-testing.list

# install ros packages
RUN apt-get update && apt-get install -y \
      ros-${ROS_DISTRO}-irobot-create-msgs \
      ros-${ROS_DISTRO}-create3-republisher \
      git \
      nano && \
    rm -rf /var/lib/apt/lists/*

I've tried another image that does not include the testing server, and it too is exhibiting the same bug when I try to echo topics inside the container. So it's not the presence of the testing server that's causing this.

build.sh

#!/bin/bash

docker build -t create3-republisher .

Pretty standard build for a container.

docker-compose.yml

services:
  create3-republisher:
    image: create3-republisher:latest
    restart: no
    env_file:
      - config/create3.env
    command: ros2 launch create3_republisher create3_republisher_launch.py robot_ns:=/ republisher_ns:=/create3_repub
    profiles:
      - republisher
    volumes:
      - ./config:/opt/config
    network_mode: host

I'm using docker compose --profile republisher up to start my container.

config/create3.env:

FASTRTPS_DEFAULT_PROFILES_FILE=/opt/config/fastrtps-repub.xml
export ROBOT_NAMESPACE=
export ROS_DOMAIN_ID=0
export ROS_DISCOVERY_SERVER=
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp

config/fastrtps-repub.xml

<?xml version="1.0" encoding="UTF-8" ?>
<dds>
    <profiles xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles">
        <participant profile_name="turtlebot4_republisher_profile" is_default_profile="true">
            <rtps>
                <builtin>
                    <initialPeersList>
                        <locator>
                            <udpv4>
                                <address>127.0.0.1</address>
                            </udpv4>
                            <udpv4>
                                <address>192.168.186.2</address>
                            </udpv4>
                        </locator>
                    </initialPeersList>
                </builtin>
            </rtps>
        </participant>
    </profiles>
</dds>

The DDS profile is to restrict traffic from the Turtlebot4 from going anywhere other than to the Raspberry Pi the container is running on; the goal is for the Pi to be republishing all of the Create3 topics/services/actions using this container.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions