【ROS2】rviz模型显示异常(机械臂白色折叠),且rviz中提示rviz No transform from [link1] to [link2]

问题情况1

命令行提示Controller manager not available in ROS2
问题是ROS 2版本和启动文件中的更改。它适用于Ubuntu 22.04 Humble,您应该安装所有控制包,如joint_trajectory_controller,joint_state_broadcastor,controller_manager,joint-state-broadcaster-gui,然后编辑启动文件

sudo apt-get install ros-humble-gazebo-ros2-control

问题情况2

ros2 launch relaxed_ik_ros2 demo.launch.py
[INFO] [launch]: All log files can be found below /home/jjmczd/.ros/log/2024-09-29-10-42-21-084314-JJM-G3-Ubuntu22-30650
[INFO] [launch]: Default logging verbosity is set to INFO
demo.launch: using setting file path /home/jjmczd/dual_v10/install/relaxed_ik_ros2/share/relaxed_ik_ros2/relaxed_ik_core/configs/example_settings/ur5.yaml
[INFO] [relaxed_ik_rust.py-1]: process started with pid [30651]
[INFO] [rviz2-2]: process started with pid [30653]
[INFO] [robot_state_publisher-3]: process started with pid [30655]
[INFO] [rviz_viewer.py-4]: process started with pid [30657]
[robot_state_publisher-3] [INFO] [1727577741.315204336] [robot_state_publisher]: got segment base
[robot_state_publisher-3] [INFO] [1727577741.315306706] [robot_state_publisher]: got segment base_link
[robot_state_publisher-3] [INFO] [1727577741.315317149] [robot_state_publisher]: got segment base_link_inertia
[robot_state_publisher-3] [INFO] [1727577741.315323624] [robot_state_publisher]: got segment flange
[robot_state_publisher-3] [INFO] [1727577741.315329267] [robot_state_publisher]: got segment forearm_link
[robot_state_publisher-3] [INFO] [1727577741.315334892] [robot_state_publisher]: got segment shoulder_link
[robot_state_publisher-3] [INFO] [1727577741.315340357] [robot_state_publisher]: got segment tool0
[robot_state_publisher-3] [INFO] [1727577741.315366519] [robot_state_publisher]: got segment upper_arm_link
[robot_state_publisher-3] [INFO] [1727577741.315372445] [robot_state_publisher]: got segment wrist_1_link
[robot_state_publisher-3] [INFO] [1727577741.315378200] [robot_state_publisher]: got segment wrist_2_link
[robot_state_publisher-3] [INFO] [1727577741.315383845] [robot_state_publisher]: got segment wrist_3_link
[relaxed_ik_rust.py-1] Traceback (most recent call last):
[relaxed_ik_rust.py-1] File “/home/jjmczd/dual_v10/install/relaxed_ik_ros2/lib/relaxed_ik_ros2/relaxed_ik_rust.py”, line 19, in
[relaxed_ik_rust.py-1] from kdl_parser import kdl_tree_from_urdf_model
[relaxed_ik_rust.py-1] File “/home/jjmczd/dual_v10/src/relaxed_ik_ros2/scripts/kdl_parser.py”, line 35, in
[relaxed_ik_rust.py-1] import PyKDL as kdl
[relaxed_ik_rust.py-1] ModuleNotFoundError: No module named ‘PyKDL’
[ERROR] [relaxed_ik_rust.py-1]: process has died [pid 30651, exit code 1, cmd ‘/home/jjmczd/dual_v10/install/relaxed_ik_ros2/lib/relaxed_ik_ros2/relaxed_ik_rust.py --ros-args -r __node:=relaxed_ik_rust -r __ns:=/ --params-file /tmp/launch_params_37fbvs0q’].
[rviz_viewer.py-4] Traceback (most recent call last):
[rviz_viewer.py-4] File “/home/jjmczd/dual_v10/install/relaxed_ik_ros2/lib/relaxed_ik_ros2/rviz_viewer.py”, line 19, in
[rviz_viewer.py-4] from robot import Robot
[rviz_viewer.py-4] File “/home/jjmczd/dual_v10/src/relaxed_ik_ros2/scripts/robot.py”, line 14, in
[rviz_viewer.py-4] import PyKDL
[rviz_viewer.py-4] ModuleNotFoundError: No module named ‘PyKDL’
[ERROR] [rviz_viewer.py-4]: process has died [pid 30657, exit code 1, cmd ‘/home/jjmczd/dual_v10/install/relaxed_ik_ros2/lib/relaxed_ik_ros2/rviz_viewer.py --ros-args -r __node:=rviz_viewer -r ns:=/ --params-file /tmp/launch_params_elm4zs’].
[rviz2-2] [INFO] [1727577742.074073365] [rviz2]: Stereo is NOT SUPPORTED
[rviz2-2] [INFO] [1727577742.074189333] [rviz2]: OpenGl version: 4.6 (GLSL 4.6)
[rviz2-2] [INFO] [1727577742.104587793] [rviz2]: Stereo is NOT SUPPORTED
^C[WARNING] [launch]: user interrupted with ctrl-c (SIGINT)
[robot_state_publisher-3] [INFO] [1727577860.157628684] [rclcpp]: signal_handler(signum=2)
[rviz2-2] [INFO] [1727577860.157633140] [rclcpp]: signal_handler(signum=2)
[INFO] [robot_state_publisher-3]: process has finished cleanly [pid 30655]
[INFO] [rviz2-2]: process has finished cleanly [pid 30653]

在这里插入图片描述
从日志来看,relaxed_ik_ros2 包在启动时遇到了一个模块缺失的问题,导致 relaxed_ik_rust.pyrviz_viewer.py 这两个进程因 ModuleNotFoundError: No module named 'PyKDL' 错误而崩溃。

解决方法:

  1. 安装 PyKDL 模块
    这个错误表明你的环境中缺少 PyKDL,这是 KDL(Kinematics and Dynamics Library)的 Python 绑定。要解决这个问题,你需要安装 PyKDL
    可以通过以下方式安装:

    Ubuntu/Debian:

    首先,确保你已经安装了 python3-dev 和相关的 ROS 依赖

sudo apt-get update
sudo apt-get install python3-dev
sudo apt-get install python3-colcon-common-extensions

然后安装 PyKDL

sudo apt-get install python3-pykdl
  1. 检查依赖
    如果你的系统或 ROS 环境中有未满足的依赖,运行以下命令来检查并解决:

    rosdep update
    rosdep install --from-paths src --ignore-src -r -y
    
  2. 验证安装
    安装完成后,验证 PyKDL 是否正确安装:
    打开 Python 解释器,输入以下命令:

    import PyKDL
    

    如果没有报错,说明安装成功。

ros2 launch relaxed_ik_ros2 demo.launch.py
[INFO] [launch]: All log files can be found below /home/jjmczd/.ros/log/2024-09-29-11-06-33-416520-JJM-G3-Ubuntu22-55219
[INFO] [launch]: Default logging verbosity is set to INFO
demo.launch: using setting file path /home/jjmczd/dual_v10/install/relaxed_ik_ros2/share/relaxed_ik_ros2/relaxed_ik_core/configs/example_settings/ur5.yaml
[INFO] [relaxed_ik_rust.py-1]: process started with pid [55220]
[INFO] [rviz2-2]: process started with pid [55222]
[INFO] [robot_state_publisher-3]: process started with pid [55224]
[INFO] [rviz_viewer.py-4]: process started with pid [55226]
[robot_state_publisher-3] [INFO] [1727579193.568687389] [robot_state_publisher]: got segment base
[robot_state_publisher-3] [INFO] [1727579193.568779874] [robot_state_publisher]: got segment base_link
[robot_state_publisher-3] [INFO] [1727579193.568791495] [robot_state_publisher]: got segment base_link_inertia
[robot_state_publisher-3] [INFO] [1727579193.568798486] [robot_state_publisher]: got segment flange
[robot_state_publisher-3] [INFO] [1727579193.568804747] [robot_state_publisher]: got segment forearm_link
[robot_state_publisher-3] [INFO] [1727579193.568810714] [robot_state_publisher]: got segment shoulder_link
[robot_state_publisher-3] [INFO] [1727579193.568816529] [robot_state_publisher]: got segment tool0
[robot_state_publisher-3] [INFO] [1727579193.568822451] [robot_state_publisher]: got segment upper_arm_link
[robot_state_publisher-3] [INFO] [1727579193.568828472] [robot_state_publisher]: got segment wrist_1_link
[robot_state_publisher-3] [INFO] [1727579193.568834468] [robot_state_publisher]: got segment wrist_2_link
[robot_state_publisher-3] [INFO] [1727579193.568840402] [robot_state_publisher]: got segment wrist_3_link
[relaxed_ik_rust.py-1] [INFO] [1727579193.997212661] [relaxed_ik_rust]: Using setting file /home/jjmczd/dual_v10/install/relaxed_ik_ros2/share/relaxed_ik_ros2/relaxed_ik_core/configs/example_settings/ur5.yaml
[relaxed_ik_rust.py-1] Traceback (most recent call last):
[relaxed_ik_rust.py-1] File “/home/jjmczd/dual_v10/install/relaxed_ik_ros2/lib/relaxed_ik_ros2/relaxed_ik_rust.py”, line 210, in
[relaxed_ik_rust.py-1] relaxed_ik = RelaxedIK()
[relaxed_ik_rust.py-1] File “/home/jjmczd/dual_v10/install/relaxed_ik_ros2/lib/relaxed_ik_ros2/relaxed_ik_rust.py”, line 73, in init
[relaxed_ik_rust.py-1] self.robot = Robot(setting_file_path)
[relaxed_ik_rust.py-1] File “/home/jjmczd/dual_v10/src/relaxed_ik_ros2/scripts/robot.py”, line 32, in init
[relaxed_ik_rust.py-1] self.robot = URDF.from_xml_file(path_to_src + “/configs/urdfs/” + urdf_name)
[relaxed_ik_rust.py-1] File “/opt/ros/humble/lib/python3.10/site-packages/urdf_parser_py/xml_reflection/core.py”, line 617, in from_xml_file
[relaxed_ik_rust.py-1] return cls.from_xml_string(xml_string)
[relaxed_ik_rust.py-1] File “/opt/ros/humble/lib/python3.10/site-packages/urdf_parser_py/xml_reflection/core.py”, line 610, in from_xml_string
[relaxed_ik_rust.py-1] node = etree.fromstring(xml_string)
[relaxed_ik_rust.py-1] File “src/lxml/etree.pyx”, line 3252, in lxml.etree.fromstring
[relaxed_ik_rust.py-1] File “src/lxml/parser.pxi”, line 1908, in lxml.etree._parseMemoryDocument
[relaxed_ik_rust.py-1] ValueError: Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration.
[rviz_viewer.py-4] [INFO] [1727579194.079390151] [rviz_viewer]: Using setting file /home/jjmczd/dual_v10/install/relaxed_ik_ros2/share/relaxed_ik_ros2/relaxed_ik_core/configs/example_settings/ur5.yaml
[rviz_viewer.py-4] Traceback (most recent call last):
[rviz_viewer.py-4] File “/home/jjmczd/dual_v10/install/relaxed_ik_ros2/lib/relaxed_ik_ros2/rviz_viewer.py”, line 158, in
[rviz_viewer.py-4] rviz_viewer = RvizViewer()
[rviz_viewer.py-4] File “/home/jjmczd/dual_v10/install/relaxed_ik_ros2/lib/relaxed_ik_ros2/rviz_viewer.py”, line 50, in init
[rviz_viewer.py-4] self.robot = Robot(setting_file_path)
[rviz_viewer.py-4] File “/home/jjmczd/dual_v10/src/relaxed_ik_ros2/scripts/robot.py”, line 32, in init
[rviz_viewer.py-4] self.robot = URDF.from_xml_file(path_to_src + “/configs/urdfs/” + urdf_name)
[rviz_viewer.py-4] File “/opt/ros/humble/lib/python3.10/site-packages/urdf_parser_py/xml_reflection/core.py”, line 617, in from_xml_file
[rviz_viewer.py-4] return cls.from_xml_string(xml_string)
[rviz_viewer.py-4] File “/opt/ros/humble/lib/python3.10/site-packages/urdf_parser_py/xml_reflection/core.py”, line 610, in from_xml_string
[rviz_viewer.py-4] node = etree.fromstring(xml_string)
[rviz_viewer.py-4] File “src/lxml/etree.pyx”, line 3252, in lxml.etree.fromstring
[rviz_viewer.py-4] File “src/lxml/parser.pxi”, line 1908, in lxml.etree._parseMemoryDocument
[rviz_viewer.py-4] ValueError: Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration.
[rviz2-2] [INFO] [1727579194.249954931] [rviz2]: Stereo is NOT SUPPORTED
[rviz2-2] [INFO] [1727579194.250061618] [rviz2]: OpenGl version: 4.6 (GLSL 4.6)
[rviz2-2] [INFO] [1727579194.272132868] [rviz2]: Stereo is NOT SUPPORTED
[ERROR] [relaxed_ik_rust.py-1]: process has died [pid 55220, exit code 1, cmd ‘/home/jjmczd/dual_v10/install/relaxed_ik_ros2/lib/relaxed_ik_ros2/relaxed_ik_rust.py --ros-args -r __node:=relaxed_ik_rust -r __ns:=/ --params-file /tmp/launch_params_z8j88dz1’].
[ERROR] [rviz_viewer.py-4]: process has died [pid 55226, exit code 1, cmd ‘/home/jjmczd/dual_v10/install/relaxed_ik_ros2/lib/relaxed_ik_ros2/rviz_viewer.py --ros-args -r __node:=rviz_viewer -r __ns:=/ --params-file /tmp/launch_params_xjfcdl49’].

根据您提供的错误日志,您在尝试运行 ROS 2 的 relaxed_ik_ros2 包时遇到了一些问题。特别是,错误信息指向了 ValueError: Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration. 这意味着在处理 URDF 文件时出现了问题,通常是因为 XML 文件的编码声明不被支持。

检查 URDF 文件

  • 找到配置文件 /home/jjmczd/dual_v10/install/relaxed_ik_ros2/share/relaxed_ik_ros2/relaxed_ik_core/configs/example_settings/ur5.yaml 中引用的 URDF 文件路径。
  • 打开 URDF 文件并检查文件开头是否包含 XML 声明。例如,可能会看到类似于 <?xml version="1.0" encoding="UTF-8"?> 的行。
  • 尝试删除该行,只保留实际的 XML 内容。

移除 URDF 文件中的 XML 声明(如 <?xml version="1.0"?>)的原因主要是因为某些 XML 解析器(例如,在 ROS 2 中使用的 lxml 库)在处理带有编码声明的 Unicode 字符串时会出现问题。具体来说,错误信息中提到:

ValueError: Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration.

这说明:

  1. 解析器限制:某些解析器不支持带有编码声明的 Unicode 字符串,因此当你尝试将带有 XML 声明的 URDF 作为字符串传递时,会导致解析失败。

  2. 字节输入要求:为了解决这个问题,解析器期望接收字节格式的输入(即以 rb 模式打开文件并读取为字节),或者 URDF 文本应该不包含 XML 声明。

  3. 避免编码问题:移除 XML 声明可以避免由于不同编码(例如 UTF-8、UTF-16)引起的潜在解析问题。将 URDF 文件处理为字节而不是字符串可以确保解析器能够正确处理内容,而不必考虑文件编码。

demo.launch.py 文件

# 从 ament_index_python.packages 导入 get_package_share_directory 方法
# 这个方法用于获取 ROS 2 包的共享目录路径
from ament_index_python.packages import get_package_share_directory

# 从 launch_ros.actions 导入 Node 类
# Node 类用于定义 ROS 2 节点
from launch_ros.actions import Node

# 导入 yaml 模块用于解析 YAML 文件
import yaml

# 从 launch 导入 LaunchDescription 类
# LaunchDescription 类用于定义启动描述
from launch import LaunchDescription

# 获取 'relaxed_ik_ros2' 包的共享目录路径
path_to_src = get_package_share_directory('relaxed_ik_ros2')

# 设置文件路径,指向示例设置文件 ur5.yaml
setting_file_path = path_to_src + '/relaxed_ik_core/configs/example_settings/ur5.yaml'

# 定义生成启动描述的函数
def generate_launch_description():
    # 打开设置文件并读取内容
    setting_file = open(setting_file_path, 'r')
    settings = yaml.load(setting_file, Loader=yaml.FullLoader)  # 使用 yaml 加载设置内容

    # 获取 URDF 文件路径,基于设置文件中的 URDF 名称
    urdf_path = path_to_src + '/relaxed_ik_core/configs/urdfs/' + settings["urdf"]

    # 打开 URDF 文件并读取其内容
    urdf_file = open(urdf_path, 'r')
    urdf_string = urdf_file.read()  # 将文件内容读入为字符串

    # 打印正在使用的设置文件路径
    print("demo.launch: using setting file path", str(setting_file_path))

    # 返回一个 LaunchDescription 对象,定义要启动的节点
    return LaunchDescription([
        Node(
            package='relaxed_ik_ros2',  # 定义包名
            namespace='',  # 定义命名空间
            executable='relaxed_ik_rust.py',  # 可执行文件名
            name='relaxed_ik_rust',  # 节点名称
            parameters=[  # 参数列表
                {'use_visualization': True,  # 使用可视化
                 'setting_file_path': setting_file_path}  # 设置文件路径
            ]
        ), 
        Node(
            package='rviz2',  # 定义包名
            name='rviz2',  # 节点名称
            executable='rviz2',  # 可执行文件名
            output='screen',  # 输出到屏幕
            arguments=['-d', path_to_src + "/rviz/relaxed_ik_viewer.rviz"],  # RViz 配置文件
        ),
        Node(
            package='robot_state_publisher',  # 定义包名
            name='robot_state_publisher',  # 节点名称
            executable='robot_state_publisher',  # 可执行文件名
            output='screen',  # 输出到屏幕
            arguments=[urdf_path],  # URDF 文件路径作为参数
            parameters=[{  # 参数列表
                'publish_frequency': 50.0,  # 发布频率
                'robot_description': urdf_string  # 机器人描述(URDF)
            }]
        ),
        Node(
            package='relaxed_ik_ros2',  # 定义包名
            namespace='',  # 定义命名空间
            executable='rviz_viewer.py',  # 可执行文件名
            name='rviz_viewer',  # 节点名称
            output='screen',  # 输出到屏幕
            parameters=[{'setting_file_path': setting_file_path}]  # 设置文件路径
        ),
    ])

总结

这个代码的主要功能是定义一个 ROS 2 启动文件,启动多个节点,包括用于解决逆运动学的节点、RViz 可视化工具和机器人状态发布器。每一行的注释说明了代码的具体功能,以帮助理解其工作原理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值