当前位置:   article > 正文

【ROS2】通过launch使用rviz2加载xacro模型_launch文件同时调用urdf和xacro

launch文件同时调用urdf和xacro

刚刚由ros1升级到ros2,发现教程比想的要少,含泪开启了新的踩坑之旅


环境配置
ubuntu版本:22.04
ros版本:ros2 humble

1、工作空间目录

我的工作空间/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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

robot_simple_description.urdf.xacro里包含了另外两个xacro文件,所以后面只会用到它。

2、.launch.py编写

如果你的功能包结构和我一样,只要把在前面声明的三个名字变量改成自己的文件就好了,如果不一样,主要是把文件路径那里改成你的文件路径。

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

3、遇到的问题

joint_state_publisher

参考小鱼文章的时候,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]
        )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在里面通过arg给了模型文件,我仿照这样写,tf树乱了还丢了几个link,删掉就好了。这可能是因为他用的是urdf,而我用的是xacro(?

找不到.rviz文件

把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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

rviz不显示机器人模型

无报错信息,tf正常加载,但没有模型
在这里插入图片描述
解决:
在这里插入图片描述
手动在这里点一下,会弹出下拉框,选择/robot_description
在这里插入图片描述
模型就可以正常显示了

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/671839
推荐阅读
  

闽ICP备14008679号