【ROS2】通过launch使用rviz2加载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

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

import xacro

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,)
    doc = xacro.parse(open(robot_description))
    xacro.process_doc(doc)
    
    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': doc.toxml()
            }]
        )
    # 启动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

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]
        )

在里面通过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()

rviz不显示机器人模型

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值