赞
踩
刚刚由ros1升级到ros2,发现教程比想的要少,含泪开启了新的踩坑之旅
环境配置:
ubuntu版本:22.04
ros版本:ros2 humble
我的工作空间/src下实现这部分内容的功能包结构如下,供大家参考
rob_description
├── CMakeLists.txt
├── package.xml
├── launch
│ └── display.launch.py
├── meshes
│ └── xxx.STL
├── rviz
│ └── display.rviz
└── urdf
├── robot_simple_description.urdf.xacro
├── robot_simple_without_track.urdf.xacro
└── rviz_track.urdf.xacro
robot_simple_description.urdf.xacro里包含了另外两个xacro文件,所以后面只会用到它。
如果你的功能包结构和我一样,只要把在前面声明的三个名字变量改成自己的文件就好了,如果不一样,主要是把文件路径那里改成你的文件路径。
import os from ament_index_python.packages import get_package_share_directory from launch import LaunchDescription from launch_ros.actions import Node from launch.substitutions import Command def generate_launch_description(): # 声明包名、文件名,方便以后换文件 package_name = 'robot_description' urdf_name = 'robot_simple_description.urdf.xacro' rviz_name = 'display.rviz' ld = LaunchDescription() # 获取功能包路径(注意,这个路径是在工作空间的install文件夹里 pkg_description = get_package_share_directory(package_name) # 声明文件路径,os.path.join将口号内的str用\连接,组成路径 robot_description = os.path.join(pkg_description, 'urdf', urdf_name,) rviz_config_path = os.path.join(pkg_description, 'rviz', rviz_name) # 发布关节状态,无关节调节可视化窗口 joint_state_publisher_node = Node( package='joint_state_publisher', executable='joint_state_publisher', name='joint_state_publisher', ) # 发布关节状态,有关节调节可视化窗口 joint_state_publisher_gui_node = Node( package='joint_state_publisher_gui', executable='joint_state_publisher_gui', name='joint_state_publisher_gui', ) # 发布机器人状态 robot_state_publisher_node = Node( package='robot_state_publisher', executable='robot_state_publisher', parameters=[{ 'robot_description': Command(["xacro ",str(robot_description)]) }] ) # 启动rviz2 rviz_node = Node( package="rviz2", executable="rviz2", name="rviz2", output="screen", arguments=['-d', rviz_config_path] ) ld.add_action(robot_state_publisher_node) ld.add_action(joint_state_publisher_node) # 这行和下一行有其中一个就行,不要同时都用 # ld.add_action(joint_state_publisher_gui_node) ld.add_action(rviz_node) return ld
参考小鱼文章的时候,joint_state_publisher节点是这样写的
joint_state_publisher_node = Node(
package='joint_state_publisher_gui',
executable='joint_state_publisher_gui',
name='joint_state_publisher_gui',
arguments=[urdf_model_path]
)
在里面通过arg给了模型文件,我仿照这样写,tf树乱了还丢了几个link,删掉就好了。这可能是因为他用的是urdf,而我用的是xacro(?
把rviz页面插件调好以后,把配置保存为display.rviz后,每一次启动都还需要重新设置,也就是说每一次都没有调用的之前保存的.rviz文件。随后发现launch里调用的是install里的而不是src里的,我顺着路径找,发现根本就没把功能包里rviz文件夹编译过来!
解决:
在CMakeLists里面install那里加上你这个功能包里要编到install里的文件夹。
以下是我的CMakeLists文件,给大家作参考
project(robot_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) find_package(urdf REQUIRED) # uncomment the following section in order to fill in # further dependencies manually. # find_package(<dependency> REQUIRED) # 改这里!!(和ros1有不同,别忘记) install( DIRECTORY launch meshes urdf rviz DESTINATION share/${PROJECT_NAME} ) 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() ament_package()
无报错信息,tf正常加载,但没有模型
解决:
手动在这里点一下,会弹出下拉框,选择/robot_description
模型就可以正常显示了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。