问题情况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.py
和 rviz_viewer.py
这两个进程因 ModuleNotFoundError: No module named 'PyKDL'
错误而崩溃。
解决方法:
-
安装
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
-
检查依赖
如果你的系统或 ROS 环境中有未满足的依赖,运行以下命令来检查并解决:rosdep update rosdep install --from-paths src --ignore-src -r -y
-
验证安装
安装完成后,验证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.
这说明:
-
解析器限制:某些解析器不支持带有编码声明的 Unicode 字符串,因此当你尝试将带有 XML 声明的 URDF 作为字符串传递时,会导致解析失败。
-
字节输入要求:为了解决这个问题,解析器期望接收字节格式的输入(即以
rb
模式打开文件并读取为字节),或者 URDF 文本应该不包含 XML 声明。 -
避免编码问题:移除 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 可视化工具和机器人状态发布器。每一行的注释说明了代码的具体功能,以帮助理解其工作原理。