目录
- 0 专栏介绍
- 1 Rviz2插件
- 2 项目配置
- 3 案例一:工具栏插件
- 4 案例二:多点导航插件
- 5 综合演示
- 5.1 添加插件
- 5.2 多点巡航
0 专栏介绍
本专栏旨在通过对ROS2的系统学习,掌握ROS2底层基本分布式原理,并具有机器人建模和应用ROS2进行实际项目的开发和调试的工程能力。
🚀详情:《ROS2从入门到精通》
1 Rviz2插件
ROS2从入门到精通2-2:详解机器人3D可视化工具Rviz2与案例分析中说到ROS2
提供了一个三维可视化工具,用于可视化传感器的数据和状态信息——Rvi2z
,并介绍了Rviz2
的基本使用方法
事实上,Rviz2
是一种支持扩展的视图工具,可以使用插件机制来扩展丰富的功能,进行二次开发。Rviz2
中使用的激光数据可视化、图像数据可视化等其实都是官方提供的插件
本文将介绍如何为Rviz2定制插件,使用的案例是实现一个工具栏导航箭头以及多点导航控制功能
2 项目配置
首先是CMakeLists.txt
文件,因为Rviz2
实际上是采用QT
开发的,所以和一般的ROS
工程相比,要增加一些QT
库的链接配置
# Find QT dependencies
SET(CMAKE_PREFIX_PATH "/usr/lib/x86_64-linux-gnu/cmake")
set(CMAKE_AUTOMOC ON)
find_package(Qt5 COMPONENTS Core Gui Widgets UiTools REQUIRED) #Ejemplo para QWidget
QT5_WRAP_CPP(QT_HEADERS ${MOC_HEADERS})
set(dependencies
...
Qt5
)
add_library(${library_name} SHARED
...
${MOC_FILES}
...
)
3 案例一:工具栏插件
在package.xml
中配置插件导出
<export>
<build_type>ament_cmake</build_type>
<nav2_core plugin="${prefix}/goal_set_plugin.xml" />
</export>
配置插件说明文件
<library path="goal_set_plugin">
<class name="goal_set_plugin/GoalSetPlugin"
type="goal_set_plugin::GoalSetPlugin"
base_class_type="rviz_common::Tool">
<description>A tool for goal setting.</description>
</class>
</library>
主体继承自rviz_default_plugins::tools::PoseTool
namespace goal_set_plugin
{
class RVIZ_DEFAULT_PLUGINS_PUBLIC GoalSetPlugin : public rviz_default_plugins::tools::PoseTool
{
Q_OBJECT
public:
GoalSetPlugin();
virtual ~GoalSetPlugin() {}
virtual void onInitialize();
protected:
virtual void onPoseSet(double x, double y, double theta);
private Q_SLOTS:
void updateTopic();
private:
// The ROS node handle.
std::shared_ptr<rclcpp::Node> nh_;
// goal publisher
rclcpp::Publisher<geometry_msgs::msg::PoseStamped>::SharedPtr wp_goal_pub_;
rviz_common::properties::StringProperty *topic_property_;
};
}
本项目使用这个插件为多点导航功能提供可视化选点
4 案例二:多点导航插件
在package.xml
中配置插件导出
<export>
<build_type>ament_cmake</build_type>
<nav2_core plugin="${prefix}/multi_nav_plugin.xml" />
</export>
配置插件说明文件
<library path="multi_nav_plugin">
<class name="multi_nav_plugin/MultiNavPlugin"
type="multi_nav_plugin::MultiNavPlugin"
base_class_type="rviz_common::Panel">
<description>A panel widget allowing multi-goals navigation.</description>
</class>
</library>
主体继承自rviz_common::Panel
namespace multi_nav_plugin
{
/**
* @brief multiple navigation setting plugin class
*/
class MultiNavPlugin : public rviz_common::Panel
{
Q_OBJECT
public:
MultiNavPlugin(QWidget *parent = 0);
public Q_SLOTS:
void onInitialize() override;
protected Q_SLOTS:
void _startNavigation();
void _cancelNavigation();
void _completeNavigation();
void _cycleNavigation();
void _updatePoseTable();
void _onGoalUpdate(const geometry_msgs::msg::PoseStamped &pose);
void _OnResultCallback(const GoalHandle::WrappedResult & result_message);
void _checkCycle();
void _startSpin();
};
}
5 综合演示
5.1 添加插件
首先通过Rviz2
->Panels
->Add New Panel
添加多点导航插件MultiNavPlugin
,打开插件后如图所示
通过Rviz2
->Add New Tool
添加Goal Setting
插件
5.2 多点巡航
通过2D Pose Estimate
给机器人一个初始位置
接着设置导航点数量,以3为例,点击OK
后出现对应数量的表格
通过Waypoint goal
设置3个任意的路点
设置完毕后如下所示
点击start
即可开始依次遍历路点。也可以通过cancel
取消当前的导航任务,或通过cycle
进行循环导航
完整代码通过下方博主名片联系获取
🔥 更多精彩专栏:
- 《ROS从入门到精通》
- 《Pytorch深度学习实战》
- 《机器学习强基计划》
- 《运动规划实战精讲》
- …