刚刚由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
模型就可以正常显示了