【附带源码】机械臂MoveIt2极简教程(五)、第二个demo - rviz可视化

系列文章目录

【附带源码】机械臂MoveIt2极简教程(一)、moveit2安装
【附带源码】机械臂MoveIt2极简教程(二)、move_group交互
【附带源码】机械臂MoveIt2极简教程(三)、URDF/SRDF介绍
【附带源码】机械臂MoveIt2极简教程(四)、第一个入门demo
【附带源码】机械臂MoveIt2极简教程(五)、第二个demo - rviz可视化


目录

  • 系列文章目录
  • 1. 新建C++代码
  • 2. 修改launch文件
  • 3. 修改CMakeLists.txt
  • 4. 运行


本节实现的效果就是在rviz中添加文字和机械臂运动轨迹画图

机械臂MoveIt2极简教程(五)、rviz可视化

在这里插入图片描述

本节demo不另外创建package包,直接在上一节的demo_moveit包中运行。做的改动包括三个

  • 新建C++代码
  • 修改launch文件的Node
  • 修改CMakeLists.txt

1. 新建C++代码

注意代码中两个地方的修改,一个是MoveGroupInterface传入的机械臂名称叫panda_arm;另一个是MoveItVisualTools中传入的tf link名称叫panda_link0。如果这两个地方没有和机械臂本体对应上,那么rviz中无法显示你需要的文字和路径图标。

#include <rclcpp/rclcpp.hpp>
#include <moveit/move_group_interface/move_group_interface.h>
#include <moveit_visual_tools/moveit_visual_tools.h>int main(int argc, char **argv)
{rclcpp::init(argc, argv);auto node = rclcpp::Node::make_shared("visualize_in_rviz", rclcpp::NodeOptions().automatically_declare_parameters_from_overrides(true));rclcpp::executors::SingleThreadedExecutor executors;executors.add_node(node);std::thread([&executors](){ executors.spin(); }).detach();auto const logger = rclcpp::get_logger("visualize_in_rviz");RCLCPP_INFO(logger, "start ");auto move_group = moveit::planning_interface::MoveGroupInterface(node, "panda_arm");auto moveit_visual_tools = moveit_visual_tools::MoveItVisualTools(node, "panda_link0", rviz_visual_tools::RVIZ_MARKER_TOPIC, move_group.getRobotModel());moveit_visual_tools.deleteAllMarkers();moveit_visual_tools.loadRemoteControl();auto const draw_title = [&moveit_visual_tools](auto text){auto const text_pose = []{auto msg = Eigen::Isometry3d::Identity();msg.translation().z() = 1.0; // Place text 1m above the base linkreturn msg;}();moveit_visual_tools.publishText(text_pose, text, rviz_visual_tools::WHITE,rviz_visual_tools::XLARGE);};auto const prompt = [&moveit_visual_tools](auto text){moveit_visual_tools.prompt(text);};auto const draw_trajectory_tool_path =[&moveit_visual_tools,jmg = move_group.getRobotModel()->getJointModelGroup("panda_arm")](auto const trajectory){moveit_visual_tools.publishTrajectoryLine(trajectory, jmg);};// Set a target Poseauto const target_pose = []{geometry_msgs::msg::Pose msg;msg.orientation.w = 1.0;msg.position.x = 0.28;msg.position.y = -0.2;msg.position.z = 0.5;return msg;}();move_group.setPoseTarget(target_pose);// Create a plan to that target poseprompt("Press 'Next' in the RvizVisualToolsGui window to plan");draw_title("Planning");moveit_visual_tools.trigger();auto const [success, plan] = [&move_group]{moveit::planning_interface::MoveGroupInterface::Plan msg;auto const ok = static_cast<bool>(move_group.plan(msg));return std::make_pair(ok, msg);}();// Execute the planif (success){draw_trajectory_tool_path(plan.trajectory_);moveit_visual_tools.trigger();prompt("Press 'Next' in the RvizVisualToolsGui window to execute");draw_title("Executing");moveit_visual_tools.trigger();move_group.execute(plan);}else{draw_title("Planning Failed!");moveit_visual_tools.trigger();RCLCPP_ERROR(logger, "Planning failed!");}rclcpp::shutdown();return 0;
}

2. 修改launch文件

沿用上一节的launch文件demo_moveit.launch.py

import os
import yaml
from launch import LaunchDescription
from launch_ros.actions import Node
from ament_index_python.packages import get_package_share_directory
import xacrodef load_file(package_name, file_path):package_path = get_package_share_directory(package_name)absolute_file_path = os.path.join(package_path, file_path)try:with open(absolute_file_path, "r") as file:return file.read()except EnvironmentError:  # parent of IOError, OSError *and* WindowsError where availablereturn Nonedef load_yaml(package_name, file_path):package_path = get_package_share_directory(package_name)absolute_file_path = os.path.join(package_path, file_path)try:with open(absolute_file_path, "r") as file:return yaml.safe_load(file)except EnvironmentError:  # parent of IOError, OSError *and* WindowsError where availablereturn Nonedef generate_launch_description():robot_description_config = xacro.process_file(os.path.join(get_package_share_directory("moveit_resources_panda_moveit_config"),"config","panda.urdf.xacro",))robot_description = {"robot_description": robot_description_config.toxml()}robot_description_semantic_config = load_file("moveit_resources_panda_moveit_config", "config/panda.srdf")robot_description_semantic = {"robot_description_semantic": robot_description_semantic_config}kinematics_yaml = load_yaml("moveit_resources_panda_moveit_config", "config/kinematics.yaml")# 第四节# move_group_demo = Node(#     package="demo_moveit",#     executable="demo_moveit",#     name="demo_moveit",#     output="screen",#     parameters=[robot_description, #                 robot_description_semantic, #                 kinematics_yaml,#                 ],# )# 第五节move_group_demo = Node(package="demo_moveit",executable="visualize_in_rviz",name="visualize_in_rviz",output="screen",parameters=[robot_description, robot_description_semantic, kinematics_yaml,],)return LaunchDescription([move_group_demo])

3. 修改CMakeLists.txt

依旧沿用上一节的CMakeLists.txt,只是添加了新的节点

cmake_minimum_required(VERSION 3.10.2)
project(demo_moveit)# Common cmake code applied to all moveit packages
find_package(moveit_common REQUIRED)
moveit_package()find_package(Eigen3 REQUIRED)
find_package(Boost REQUIRED system filesystem date_time thread)
find_package(ament_cmake REQUIRED)
find_package(control_msgs REQUIRED)
find_package(moveit_core REQUIRED)
find_package(moveit_ros_planning REQUIRED)
find_package(moveit_ros_planning_interface REQUIRED)
find_package(moveit_ros_perception REQUIRED)
find_package(moveit_servo REQUIRED)
find_package(interactive_markers REQUIRED)
find_package(rviz_visual_tools REQUIRED)
find_package(moveit_visual_tools REQUIRED)
find_package(geometric_shapes REQUIRED)
find_package(rclcpp REQUIRED)
find_package(rclcpp_action REQUIRED)
find_package(pluginlib REQUIRED)
find_package(tf2_ros REQUIRED)
find_package(tf2_eigen REQUIRED)
find_package(tf2_geometry_msgs REQUIRED)set(THIS_PACKAGE_INCLUDE_DIRSdoc/interactivity/include
)set(THIS_PACKAGE_INCLUDE_DEPENDSament_cmakerclcpprclcpp_actiontf2_geometry_msgstf2_rosmoveit_corerviz_visual_toolsmoveit_visual_toolsmoveit_ros_planning_interfaceinteractive_markerstf2_geometry_msgsmoveit_ros_planningpluginlibEigen3Boostcontrol_msgsmoveit_servo
)include_directories(${THIS_PACKAGE_INCLUDE_DIRS})ament_export_dependencies(${THIS_PACKAGE_INCLUDE_DEPENDS}
)ament_export_include_directories(include)# -------------------------------------------------------------- executable
add_executable(demo_moveitsrc/demo_moveit.cpp)target_include_directories(demo_moveitPUBLIC include)ament_target_dependencies(demo_moveit${THIS_PACKAGE_INCLUDE_DEPENDS} Boost)# -------------------------------------------------------------- executable
add_executable(visualize_in_rvizsrc/visualize_in_rviz.cpp)target_include_directories(visualize_in_rvizPUBLIC include)ament_target_dependencies(visualize_in_rviz${THIS_PACKAGE_INCLUDE_DEPENDS} Boost)# -------------------------------------------------------------- installinstall(TARGETS demo_moveit visualize_in_rviz planning_around_objectsDESTINATION lib/${PROJECT_NAME}
)
install(DIRECTORY launchDESTINATION share/${PROJECT_NAME}
)ament_package()

4. 运行

  • 进入工作空间,编译项目
cd ~/ws_moveitcolcon build --cmake-args -DCMAKE_BUILD_TYPE=Release --packages-select demo_moveit
  • 启动panda_arm机械臂
ros2 launch moveit2_tutorials demo.launch.py
  1. 记得先把MotionPlanning关闭,因为目前用不到;
  2. 添加插件RvizVisualToolsGui
  3. 添加MarkerArray,topic选择/rviz_visual_tools

在这里插入图片描述
在这里插入图片描述

  • 启动本节程序
ros2 launch demo_moveit demo_moveit.launch.py
  • 点击RvizVisualToolsGui的Next按钮,即可看到机械臂运动动画,如文章开头的视频展示的一样。

觉得对您有帮助的,可以点个赞👍支持一下,谢谢各位!

因为淋过雨,所以想为别人撑把伞;因为踩过太多坑,所以想让喜欢机器人的同学们减少试错成本!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/30148.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中和的区别

在Java中&#xff0c;& 和 && 都是逻辑运算符&#xff0c;但它们之间存在一些重要的区别&#xff0c;特别是在它们如何评估其操作数以及它们的性能影响方面。 短路评估&#xff08;Short-Circuit Evaluation&#xff09;&#xff1a; &&&#xff08;逻辑…

免费分享:2014-2021年OSM中国POI数据(附下载方法)

OpenStreetMap&#xff08;OSM&#xff09;是一个全球性的开源协作地图项目&#xff0c;允许任何人编辑和分享地理信息&#xff0c;旨在创建自由、准确且可广泛使用的世界地图。POI是“Point of Interest”的缩写&#xff0c;意为“兴趣点”。 OSM POI矢量数据是OpenStreetMap项…

超神级!Markdown最详细教程,程序员的福音

超神级&#xff01;Markdown最详细教程&#xff0c;程序员的福音Markdown最详细教程&#xff0c;关于Markdown的语法和使用就先讲到这里&#xff0c;如果喜欢&#xff0c;请关注“IT技术馆”。馆长会更新​最实用的技术&#xff01;https://mp.weixin.qq.com/s/fNzhLFyYRd3skG-…

Hash路由、History路由原理及优缺点

Hash路由 原理&#xff1a; 主要基于浏览器提供的window.location.hash属性。 初始化时: 浏览器地址栏中的URL会包含一个"#"符号及其后面的部分,称为"hash"。 前端程序会监听window.onhashchange事件,在hash发生变化时触发回调函数。路由切换时: 当用户…

为什么人们对即将推出的 Go 1.23 迭代器感到愤怒

原文&#xff1a;gingerBill - 2024.06.17 TL;DR 它让 Go 变得太“函数式”&#xff0c;而不再是不折不扣的命令式语言。 最近&#xff0c;我在 Twitter 上看到一篇帖子&#xff0c;展示了 Go 1.23&#xff08;2024 年 8 月&#xff09;即将推出的 Go 迭代器设计。据我所知&a…

golang windows打包为linux可执行文件

使用go的交叉编译功能 set GOOSlinux set GOARCHamd64然后再执行go build 可能会报异常, 所以贴出我的go env配置仅供参考 go env环境配置 D:\GoWork\src\go-tzv>go env set GO111MODULEauto set GOARCHamd64 set GOBIN …

寄存器和存储器的区别与联系

在计算机系统中&#xff0c;寄存器和存储器是两个重要的概念&#xff0c;它们在数据存储和处理过程中扮演着不同但互补的角色。本文将详细讨论寄存器和存储器的区别与联系。 1. 基本概念 **寄存器&#xff08;Register&#xff09;**是一种速度极快的小容量存储单元&#xff…

Maven 插件列表详解

Maven 是一个强大的项目管理和构建工具&#xff0c;广泛应用于 Java 项目中。作为一款优秀的构建管理工具&#xff0c;Maven 不仅提供了标准化的项目结构和依赖管理&#xff0c;还通过其丰富的插件系统&#xff0c;极大地扩展了其功能和灵活性。无论是代码编译、测试、打包&…

2024级中国社科院中外合作办学双证博士和英国斯特灵的管理学博士

2024级中国社科院中外合作办学双证博士和英国斯特灵的管理学博士 中国社科院-英国斯特灵大学合办的创新与领导力博士项目&#xff08;DOCTOR OF MANAGEMENT 简称“DMAN”&#xff09;是中国社会科学院大学&#xff08;中国社会科学院研究生院&#xff09;第一个博士层次的中外…

Win 10/Win 11 共享/远程访问的后续设置以及如何查看电脑的账户密码

共享设置 如何给文件设置共享这里不谈&#xff0c;右键属性添加共享&#xff0c;类似的教程也有很多&#xff08;如果这步都搞不定建议就不要折腾了&#xff0c;老老实实的用U盘吧&#xff09; 如果不出意外的话&#xff0c;你在网络界面是看不到共享pc和文件的 这时候需要两…

【VS2022 编译UE5.1 错误 C4834 】

这里写自定义目录标题 错误 错误 使用VS2022编译UE5.1源码&#xff0c;错误 C4834 放弃具有 [[nodiscard]] 属性的函数的返回值 F:\UE\Engine\Plugins\Runtime\Steam\SteamVR\Source\SteamVRInputDevice\Private\SteamVRInputDeviceFunctionLibrary.cpp(513): error C4834: d…

python jieba中文文本切割成句子

# -*- coding: utf-8 -*- # Time : 2024/6/18 10:26 # Author : Cocktail_py import jieba.posseg as psegdef cut_sentences(text):"""中文句子分割"""# 使用jieba的分句模块sentences pseg.cut(text)result []tmp []for word, flag in …

要颜值有颜值,有性价比有性价比,华硕天选键、鼠组合分享

作为ROG产品的忠实粉丝&#xff0c;用过不少ROG 相关的产品&#xff0c;近期华硕天选TX98和天选MINI 鼠标的发布&#xff0c;独特配色令我眼前一亮。 华硕天选TX98键盘&#xff0c;作为新品&#xff0c;从看上的第一眼就觉得这款键盘是非常值得推荐。 它完美地诠释了潮玩新次元…

亲测:无影云电脑免费三个月已经缩短为1个月

亲测&#xff1a;无影云电脑免费三个月已经缩短为1个月&#xff0c;大家不要再找3个月的无影云电脑&#xff0c;已经没有了&#xff0c;目前最新消息是1个月。以前可以领3个月&#xff0c;现在只能领1个月&#xff0c;在阿里云免费中心 https://free.aliyun.com/ 大家自己看吧&…

光伏电站管理app,一站式管理,一体化接单

早在1839年&#xff0c;法国科学家贝壳雷尔就发现了“光伏效应”&#xff0c;随后诞生了“光学发电”技术。随着现代化与工业化的不断发展、进步&#xff0c;出于资源再生与保护环境的需要&#xff0c;人们越来越重视光伏发电技术&#xff0c;也越来越追求光伏电站的智能化管理…

JavaScript------const

这里写目录标题 介绍在声明时赋值不是真正的常数常量对象可以更改常量数组可以更改 介绍 ES2015 引入了两个重要的 JavaScript 新关键词&#xff1a;let 和 const。 通过 const 定义的变量与 let 变量类似&#xff0c;但不能重新赋值&#xff1a; const PI 3.1415926535897…

Java中的运算符及其示例

Java中的运算符及其示例 运算符是指示编译器执行特定操作的符号。例如&#xff0c;“”运算符指示编译器执行加法&#xff0c;“>”运算符指示编译执行比较&#xff0c;“”用于赋值等等。在本指南中&#xff0c;我们将借助示例讨论java中的操作。 运算符和操作数&#…

钽掺杂锂镧锆氧(LLZTO)是优秀固态电解质 未来行业前景良好

钽掺杂锂镧锆氧&#xff08;LLZTO&#xff09;是优秀固态电解质 未来行业前景良好 钽掺杂锂镧锆氧&#xff0c;也称为锂镧锆钽氧&#xff0c;英文简称LLZTO&#xff0c;外观为白色或淡黄色结晶粉末状。LLZTO具有锂离子电导率高、对锂化学性质稳定等特点&#xff0c;是一种立方晶…

C++迈向精通:函数指针对象与函数对象

C&#xff1a;指针对象 C语言中的函数指针 在C语言中&#xff0c;我们见过如下的函数指针&#xff1a; int add(int a, int b) {return a b; }int main() {int a, b;int (*p)(int, int) add;scanf("%d%d", &a, &b);p(a, b);return 0; } 为了适应C中面向…

BPE (Byte-Pair Encoding) Tokenization

目录 一、Tokenization 的概念二、BPE 的概念三、BPE 的步骤 遇到看不明白的地方&#xff0c;欢迎在评论中留言呐&#xff0c;一起讨论&#xff0c;一起进步&#xff01; 需掌握的前提知识&#xff1a; 本文参考&#xff1a; P24 台大资讯 2023秋季 深度学习之应用 &#xff5…