小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
6.2.2章节在终端中输入运行指令之后显示package 'robot_joint_publisher' not found
-
背景:
6.2.2章节,想要实现在rviz中显示机器人
问题描述:
在根据b站课程输入所有代码后,在终端进行了'ros2 launch display_robot.launch.py'操作,但是并未打开rviz,而是报错显示了
'wlz@ros2:~/chapt6/chapt6_ws/src/fishbot_description/launch$ ros2 launch display_robot.launch.py
[INFO] [launch]: All log files can be found below /home/wlz/.ros/log/2024-11-18-16-10-28-088426-ros2-7528
[INFO] [launch]: Default logging verbosity is set to INFO
[ERROR] [launch]: Caught exception in launch (see debug for traceback): "package 'robot_joint_publisher' not found, searching: ['/home/wlz/chapt6/chapt6_ws/install/fishbot_description', '/opt/ros/humble']"'具体细节和上下文:
display_robot.launch:
import launch
import launch_ros
from ament_index_python.packages import get_package_share_directory #用于找包的文件目录,以便于导入urdf的....
import osimport launch_ros.parameter_descriptions
def generate_launch_description():
#获取默认的urdf路径
urdf_package_path = get_package_share_directory('fishbot_description')
default_urdf_path = os.path.join(urdf_package_path,'urdf','first_robot.urdf')
# 声明一个urdf目录的参数,方面修改
action_declare_arg_mode_path = launch.actions.DeclareLaunchArgument(
name='model',default_value=str(default_urdf_path),description='加载的模型文件路径'
)
# 通过文件路径,获取内容,并转换成参数值对象,以供传入 robot_state_publisher
substitutions_command_result = launch.substitutions.Command(['cat ',launch.substitutions.LaunchConfiguration('model')])
robot_description_value = launch_ros.parameter_descriptions.ParameterValue(substitutions_command_result,value_type=str)action_robot_state_publisher = launch_ros.actions.Node( package='robot_state_publisher', executable='robot_state_publisher', parameters=[{'robot_description':robot_description_value}] ) action_joint_state_publisher = launch_ros.actions.Node( package='robot_joint_publisher', executable='robot_joint_publisher' ) action_rviz_node = launch_ros.actions.Node( package='rviz2', executable='rviz2' ) return launch.LaunchDescription([ action_declare_arg_mode_path, action_robot_state_publisher, action_joint_state_publisher, action_rviz_node, ])
CMakeLists:
cmake_minimum_required(VERSION 3.8)
project(fishbot_description)if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()find dependencies
find_package(ament_cmake REQUIRED)
uncomment the following section in order to fill in
further dependencies manually.
find_package(<dependency> REQUIRED)
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)the following line skips the linter which checks for copyrights
comment the line when a copyright and license is added to all source files
set(ament_cmake_copyright_FOUND TRUE)
the following line skips cpplint (only works in a git repo)
comment the line when this package is in a git repo and when
a copyright and license is added to all source files
set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
endif()install(DIRECTORY launch urdf
DESTINATION share/${PROJECT_NAME}
)ament_package()
package:
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>fishbot_description</name>
<version>0.0.0</version>
<description>TODO: Package description</description>
<maintainer email="wlz@todo.todo">wlz</maintainer>
<license>Apache-2.0</license><buildtool_depend>ament_cmake</buildtool_depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<depend>robot-state-publisher</depend>
<depend>joint-state-publisher</depend><export>
<build_type>ament_cmake</build_type>
</export>
</package>尝试过的解决方法:
之前以为是安装完joint-state-publisher和robot-state-publisher之后没有在package文件中声明依赖的原因,声明:' <depend>robot-state-publisher</depend>
<depend>joint-state-publisher</depend>之后仍然不行' -
从您提供的错误信息和代码中,可以看出问题出在
display_robot.launch.py
文件中尝试启动一个名为robot_joint_publisher
的节点,但是系统找不到这个包。这里有几个可能的解决步骤:-
检查包名是否正确:
ROS 2 中并没有一个标准的包叫做robot_joint_publisher
。通常,关节状态发布器是由joint_state_publisher
包提供的。请检查您的display_robot.launch.py
文件中的相关部分,确保使用的是正确的包名和可执行文件。修改
display_robot.launch.py
中的以下部分:action_joint_state_publisher = launch_ros.actions.Node( package='joint_state_publisher', # 修改这里 executable='joint_state_publisher_executable' # 确保这是正确的可执行文件名,可能只是 'joint_state_publisher' )
-
确保依赖已正确安装:
您已经在package.xml
中添加了joint-state-publisher
的依赖,但请确保这个包已经被正确安装到您的 ROS 2 工作空间中。您可以通过以下命令来检查是否安装了该包:ros2 pkg list | grep joint_state_publisher
如果没有列出,您可能需要重新构建并安装您的工作空间:
cd ~/chapt6/chapt6_ws colcon build source install/setup.bash
-
检查 ROS 2 环境:
确保您的 ROS 2 环境变量设置正确,特别是ROS_PACKAGE_PATH
应该包含您的工作空间目录。您可以通过打印此环境变量来检查:echo $ROS_PACKAGE_PATH
-
检查
launch
文件的其他部分:
确认display_robot.launch.py
中的其他部分没有错误,特别是与robot_state_publisher
和rviz2
相关的部分。 -
重新运行 launch 文件:
在做了上述更改后,重新运行您的 launch 文件:ros2 launch display_robot.launch.py
如果以上步骤都正确无误,您的
rviz2
应该能够正常启动,并显示您的机器人模型。如果问题仍然存在,请检查是否有其他的配置错误或依赖问题。
以上为生成回答,仅供参考~
-
-
@321731520 看起来就是依赖没装好,再装装
-
@小伊 上述回答中的第三步显示如上图,这样正常吗
另外,我修改了一下我的代码:
import launch
import launch_ros
from ament_index_python.packages import get_package_share_directory #用于找包的文件目录,以便于导入urdf的....
import osimport launch_ros.parameter_descriptions
def generate_launch_description():
#获取默认的urdf路径
urdf_package_path = get_package_share_directory('fishbot_description')
default_urdf_path = os.path.join(urdf_package_path,'urdf','first_robot.urdf')
# 声明一个urdf目录的参数,方面修改
action_declare_arg_mode_path = launch.actions.DeclareLaunchArgument(
name='model',default_value=str(default_urdf_path),description='加载的模型文件路径'
)
# 通过文件路径,获取内容,并转换成参数值对象,以供传入 robot_state_publisher
substitutions_command_result = launch.substitutions.Command(['cat ',launch.substitutions.LaunchConfiguration('model')])
robot_description_value = launch_ros.parameter_descriptions.ParameterValue(substitutions_command_result,value_type=str)action_robot_state_publisher = launch_ros.actions.Node( package='robot_state_publisher', executable='robot_state_publisher', parameters=[{'robot_description':robot_description_value}] ) action_joint_state_publisher = launch_ros.actions.Node( package='robot_joint_publisher', executable='robot_joint_publisher' ) action_rviz_node = launch_ros.actions.Node( package='rviz2', executable='rviz2' ) return launch.LaunchDescription([ action_declare_arg_mode_path, action_robot_state_publisher, action_joint_state_publisher, action_rviz_node, ])
我将上述的步骤1中的state
-
在你的代码和描述中,有几点需要注意和修正。首先,关于你提到的“第三步显示如上图,这样正常吗”,由于你没有提供具体的“上图”内容,我无法直接判断其是否正常。不过,通常如果你在描述中提到的“第三步”是指某个特定的输出或结果,而你没有得到预期的输出,那么很可能存在问题。
接下来,我们来看一下你的代码。你的代码主要是用于生成一个ROS 2的launch文件,该launch文件用于启动
robot_state_publisher
、robot_joint_publisher
和rviz2
。以下是对你代码的一些观察和建议:-
导入语句:
你的导入语句看起来是正确的,它们应该能够正确导入所需的模块。 -
获取URDF路径:
你使用get_package_share_directory
来获取fishbot_description
包的共享目录,并拼接得到URDF文件的路径。这部分代码是正确的。 -
声明启动参数:
你使用DeclareLaunchArgument
来声明一个名为model
的启动参数,其默认值为URDF文件的路径。这部分也是正确的。 -
使用
cat
命令获取文件内容:
你使用Command(['cat ', launch.substitutions.LaunchConfiguration('model')])
来获取model
参数指定的文件内容。这种方法在大多数情况下是可行的,但依赖于外部命令(如cat
)可能不是最健壮的解决方案。在ROS 2中,通常推荐使用更直接的文件读取方法,比如通过Python的内置文件操作函数。然而,由于ROS 2的launch系统支持这种通过命令获取参数值的方式,所以这里也不是绝对错误的。 -
robot_state_publisher
节点:
你正确地创建了一个robot_state_publisher
节点,并将robot_description
参数设置为从model
参数指定的文件中读取的内容。 -
robot_joint_publisher
节点:
注意,你这里使用的包名是robot_joint_publisher
,但ROS 2的标准包名是joint_state_publisher_gui
(对于具有GUI的版本)或joint_state_publisher
(对于无GUI的版本)。请确保你使用的包名是正确的,或者你已经正确安装并配置了一个名为robot_joint_publisher
的自定义包。 -
rviz2
节点:
你正确地创建了一个rviz2
节点。但是,通常rviz2
节点会接受一些参数来配置其启动时的显示设置。你可能希望添加一些额外的参数来配置rviz2
的显示,比如加载特定的配置文件。 -
返回
LaunchDescription
:
你正确地返回了一个包含所有声明和动作的LaunchDescription
对象。
综上所述,你的代码在大多数情况下应该是可以正常工作的,但请确保
robot_joint_publisher
包名是正确的,并考虑是否需要为rviz2
添加额外的启动参数。此外,如果你提到的“第三步显示如上图”有问题,请提供更具体的信息以便进一步诊断。
以上为生成回答,仅供参考~
-
-
@小鱼 解决了,joint和robot的代码书混了