用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/MIUAV/vibe-coding-ros2 --skill rviz2命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
正在显示 SKILL.md
基于 SOC 职业分类
| name | rviz2 |
| description | RViz2 可视化开发技能 - 3D可视化、插件开发、显示类型配置、交互工具开发 |
| argument-hint | rviz配置 OR 创建显示 OR rviz插件 OR 可视化 |
| user-invocable | true |
用于 RViz2 可视化工具的配置和插件开发
当需要以下帮助时使用此技能:
# ROS2 Humble
sudo apt install ros-humble-rviz2
# ROS2 Iron
sudo apt install ros-iron-rviz2
# 从源码构建
cd ~/ros2_ws
vcs import src < https://github.com/ros2/rviz.git
cd src/rviz
rosdep install -r --from-paths . --ignore-src -y
colcon build --packages-up-to rviz_common rviz_rendering rviz
# 启动默认配置
rviz2
# 加载指定配置文件
rviz2 -d /path/to/config.rviz
# 启动新窗口
rviz2 --window geometry
Visualization Manager:
Class: "rviz2/VisualizationManager"
Fixed Frame: "map"
Tools:
- Class: "rviz_interactive_tools/MoveFace"
- Class: "rviz_default_plugins/Interact"
Hide Small Objects: false
- Class: "rviz_default_plugins/SetInitialPose"
Topic: "/initialpose"
- Class: "rviz_default_plugins/SetGoal"
Topic: "/move_base_simple/goal"
Displays:
- Class: "rviz_default_plugins/Grid"
Name: "Grid"
Plane: "XY"
Cell Size: 1
Reference Frame: "map"
- Class: "rviz_default_plugins/RobotModel"
Name: "Robot Model"
Description Topic:
Topic: "/robot_description"
Type: "robot_state/JointState"
- Class: "rviz_default_plugins/PointCloud2"
Name: "Lidar Points"
Topic:
Topic: "/scan"
Type: "sensor_msgs/PointCloud2"
Color Transform: "RGB"
Style: "Points"
- Class: "rviz_default_plugins/Map"
Name: "Occupancy Map"
Topic:
Topic: "/map"
Type: "nav_msgs/OccupancyGrid"
Color Scheme: "map"
- Class: "rviz_default_plugins/Trajectory"
Name: "Path"
Topic:
Topic: "/plan"
Type: "nav_msgs/Path"
Color: 0 0 255 255
Line Width: 3
// 创建点云显示
rviz_common::Display* createPointCloudDisplay(rviz_common::DisplayContext* context)
{
rviz_common::Display* display = context->createDisplay("rviz_default_plugins/PointCloud2");
display->initialize(context);
// 设置属性
rviz_common::Property* props = display->getProperty();
props->subProp("Topic")->subProp("Topic")->setValue("/scan");
props->subProp("Style")->setValue("Points");
props->subProp("Size (Pixels)")->setValue(3);
return display;
}
// TF 显示配置
{
"Class": "rviz_default_plugins/TF",
"Name": "TF Tree",
"Frame Timeout": 5,
"All Frames Enabled": true,
"Marker Scale": 1.0,
"Show Names": true,
"Show Axes": true,
"Show Arrows": true
}
<!-- robot.urdf.xacro -->
<?xml version="1.0" ?>
<robot name="my_robot" xmlns:xacro="http://www.ros.org/wiki/xacro">
<!-- Base Link -->
<link name="base_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<box size="0.5 0.4 0.2"/>
</geometry>
<material name="white">
<color rgba="1 1 1 1"/>
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<box size="0.5 0.4 0.2"/>
</geometry>
</collision>
</>
- Class: "nav_msgs/Path"
Name: "Global Path"
Topic:
Topic: "/move_base/NavfnROS/plan"
Type: "nav_msgs/Path"
Color: 0 255 0 255
Line Style: "Lines"
Line Width: 0.05
- Class: "nav_msgs/Path"
Name: "Local Plan"
Topic:
Topic: "/move_base/DWAPlannerROS/local_plan"
Type: "nav_msgs/Path"
Color: 255 0 0 255
Line Width: 0.03
# 创建包
cd ~/ros2_ws/src
ros2 pkg create --dependencies rviz_common rviz_rendering rviz_ogre_vendor --library-name my_rviz_plugin my_rviz_display_plugin
# CMakeLists.txt
cmake_minimum_required(VERSION 3.8)
project(my_rviz_display_plugin)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wdeprecated-register)
endif()
find_package(ament_cmake REQUIRED)
find_package(rviz_common REQUIRED)
find_package(rviz_rendering REQUIRED)
include_directories(
include
)
add_library(my_display SHARED
src/my_display.cpp
)
target_link_libraries(my_display
rviz_common::rviz_common
rviz_rendering::rviz_rendering
)
ament_target_dependencies(my_display
rclcpp
visualization_msgs
)
# Install
ament_export_libraries(my_display)
install(TARGETS my_display
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin
)
// include/my_rviz_display_plugin/my_custom_display.hpp
#ifndef MY_CUSTOM_DISPLAY_HPP_
#define MY_CUSTOM_DISPLAY_HPP_
#include <rviz_common/display.hpp>
#include <rviz_common/properties/color_property.hpp>
#include <rviz_common/properties/float_property.hpp>
namespace my_rviz_plugin
{
class MyCustomDisplay : public rviz_common::Display
{
Q_OBJECT
public:
MyCustomDisplay();
virtual ~MyCustomDisplay();
// 重载父类方法
virtual void onInitialize() override;
virtual void update(float wall_dt, float ros_dt) override;
virtual void reset() override;
protected:
virtual void processMessage(const visualization_msgs::msg::Marker::ConstSharedPtr msg) override;
private Q_SLOTS:
void updateColor;
;
:
rviz_common::properties::ColorProperty* color_property_;
rviz_common::properties::FloatProperty* scale_property_;
rviz_ogre_vendor::Ogre::SceneNode* scene_node_;
};
}
// src/my_custom_display.cpp
#include "my_rviz_display_plugin/my_custom_display.hpp"
#include <rviz_common/logging.hpp>
#include <rviz_common/frame_manager.hpp>
#include <rviz_common/properties/parse_color.hpp>
namespace my_rviz_plugin
{
MyCustomDisplay::MyCustomDisplay()
: Display()
, scene_node_(nullptr)
{
// 创建属性
color_property_ = new rviz_common::properties::ColorProperty(
"Color", QColor(255, 0, 0),
"Color of the markers",
this, SLOT(updateColor()));
scale_property_ = new rviz_common::properties::FloatProperty(
"Scale", 1.0,
"Scale of the markers",
this, SLOT(updateScale()));
}
void MyCustomDisplay::onInitialize()
{
scene_node_ = scene_manager_->getRootSceneNode()->createChildSceneNode();
}
void MyCustomDisplay::processMessage(
const visualization_msgs::msg::Marker::ConstSharedPtr msg)
{
// 处理消息并添加到场景
Ogre::SceneNode* marker_node = scene_node_->();
Ogre::ManualObject* obj = scene_manager_->(
+ std::(msg->header.stamp.nanosec));
obj->(, Ogre::RenderOperation::OT_TRIANGLE_LIST);
obj->();
marker_node->(obj);
;
marker_node->(position);
}
{
}
{
}
{
scene_node_->();
}
}
(my_rviz_plugin::MyCustomDisplay, rviz_common::Display)
<!-- my_rviz_display_plugin.xml -->
<library path="lib/libmy_display">
<class name="my_rviz_plugin/MyCustomDisplay"
type="my_rviz_plugin::MyCustomDisplay"
base_class_type="rviz_common::Display">
<description>My custom display for RViz2</description>
</class>
</library>
# CMakeLists.txt 中添加
pluginlib_export_plugin_file()
# launch/rviz.launch.py
import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch.substitutions import LaunchConfiguration
def generate_launch_description():
pkg_name = 'my_robot_bringup'
pkg_dir = get_package_share_directory(pkg_name)
rviz_config = os.path.join(pkg_dir, 'config', 'robot.rviz')
return LaunchDescription([
DeclareLaunchArgument(
'rviz_config',
default_value=rviz_config,
description='Path to RViz config file'
),
DeclareLaunchArgument(
'namespace',
default_value='',
description='Robot namespace'
),
Node(
package='rviz2',
executable='rviz2',
name='rviz2',
arguments=['-d', LaunchConfiguration('rviz_config')],
output='screen',
environment={
'ROS_DOMAIN_ID': '42'
}
)
])
- Class: "rviz_default_plugins/Image"
Name: "Camera Image"
Image Topic:
Topic: "/camera/image_raw"
Type: "sensor_msgs/Image"
Max Value: 1
Min Value: 0
Queue Size: 2
- Class: "rviz_default_plugins/Marker"
Name: "Markers"
Marker Topic:
Topic: "/visualization_marker"
Type: "visualization_msgs/Marker"
Namespaces:
obstacles: true
targets: true
- Class: "rviz_default_plugins/Odometry"
Name: "Odometry"
Topic:
Topic: "/odom"
Type: "nav_msgs/Odometry"
Keep: 100
Length: 0.5
Color: 0 255 255 255
Alpha: 1
Show Covariance: true
解决方案:
robot_description 话题Fixed Frame 设置正确解决方案:
解决方案: