从零开始的机械臂yolov5抓取gazebo仿真(四)
Moveit与Gazebo联合仿真
上一篇博客已经将moveit!配置完毕,然而想要让moveit!控制gazebo中的机械臂,还需要进行一些接口的配置。现在我们有的功能包为sunday_description、sunday_moveit_config这两个功能包。且已经配置好xacro文件,本篇内容需要进行gazebo功能包的配置以及moveit功能包的文件修改。
sunday_gazebo
创建sunday_gazebo功能包
catkin_create_pkg sunday_gazebo roscpp rospy std_msgs
创建launch、config、world、scripts等文件夹,其列表如下所示
.
├── CMakeLists.txt
├── config
├── include
├── launch
├── package.xml
├── scripts
├── src
└── world
配置关节轨迹控制器
创建sunday_gazebo/config/sunday_trajectory_control.yaml文件,用于配置关节轨迹控制器,代码如下:
sunday:arm_joint_controller:type: "position_controllers/JointTrajectoryController"joints:- joint_1- joint_2- joint_3- joint_4- joint_5- joint_6gains:joint_1: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}joint_2: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}joint_3: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}joint_4: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}joint_5: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}joint_6: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
对应创建sunday_gazebo/launch/sunday_trajectory_controller.launch文件,用于加载上述yaml文件代码如下:
<launch><rosparam file="$(find sunday_gazebo)/config/sunday_trajectory_control.yaml" command="load"/><node name="arm_controller_spawner" pkg="controller_manager" type="spawner" respawn="false"output="screen" ns="/sunday" args="arm_joint_controller"/></launch>
配置关节状态控制器
创建sunday_gazebo/config/sunday_gazebo_joint_states.yaml文件,用于配置关节状态控制器,代码如下:
sunday:# Publish all joint states -----------------------------------joint_state_controller:type: joint_state_controller/JointStateControllerpublish_rate: 50
对应创建sunday_gazebo/launch/sunday_gazebo_states.launch文件,用于加载上述yaml文件代码如下:
<launch><!-- 将关节控制器的配置参数加载到参数服务器中 --><rosparam file="$(find sunday_gazebo)/config/sunday_gazebo_joint_states.yaml" command="load"/><node name="joint_controller_spawner" pkg="controller_manager" type="spawner" respawn="false"output="screen" ns="/sunday" args="joint_state_controller" /><!-- 运行robot_state_publisher节点,发布tf --><node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"respawn="false" output="screen"><remap from="/joint_states" to="/sunday/joint_states" /></node></launch>
配置gazebo环境
创建sunday_gazebo/launch/sunday_gazebo_world.launch文件,用于加载gazebo环境,代码如下:
<launch><!-- these are the arguments you can pass this launch file, for example paused:=true --><arg name="paused" default="false"/><arg name="use_sim_time" default="true"/><arg name="gui" default="true"/><arg name="headless" default="false"/><arg name="debug" default="false"/><!-- We resume the logic in empty_world.launch --><include file="$(find gazebo_ros)/launch/empty_world.launch"><arg name="debug" value="$(arg debug)" /><arg name="gui" value="$(arg gui)" /><arg name="paused" value="$(arg paused)"/><arg name="use_sim_time" value="$(arg use_sim_time)"/><arg name="headless" value="$(arg headless)"/><arg name="world_name" value="$(find sunday_gazebo)/world/feeding_place.world"/></include><!-- Load the URDF into the ROS Parameter Server --><param name="robot_description" command="$(find xacro)/xacro --inorder '$(find sunday_description)/urdf/sunday.xacro'" /> <!-- Run a python script to the send a service call to gazebo_ros to spawn a URDF robot --><node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"args="-urdf -model sunday -param robot_description"/>
</launch>
配置moveit功能包文件
创建/修改sunday_moveit_config/config/controllers_gazebo.yaml文件,用于配置moveit!控制器接口,代码如下:
controller_manager_ns: controller_manager
controller_list:- name: sunday/arm_joint_controlleraction_ns: follow_joint_trajectorytype: FollowJointTrajectorydefault: truejoints:- joint_1- joint_2- joint_3- joint_4- joint_5- joint_6
修改sunday_moveit_config/launch/sunday_moveit_controller_manager.launch.xml,代码如下:
<launch><!-- loads moveit_controller_manager on the parameter server which is taken as argument if no argument is passed, moveit_simple_controller_manager will be set --><arg name="moveit_controller_manager" default="moveit_simple_controller_manager/MoveItSimpleControllerManager" /><param name="moveit_controller_manager" value="$(arg moveit_controller_manager)"/><!-- loads ros_controllers to the param server --><rosparam file="$(find sunday_moveit_config)/config/controllers_gazebo.yaml"/>
</launch>
创建/修改sunday_moveit_config/launch/moveit_planning_execution.launch,用于加载planning_group等moveit核心功能,代码如下:
<launch><!-- # The planning and execution components of MoveIt! configured to # publish the current configuration of the robot (simulated or real)# and the current state of the world as seen by the planner --><include file="$(find sunday_moveit_config)/launch/move_group.launch"><arg name="publish_monitored_planning_scene" value="true" /></include><!-- # The visualization component of MoveIt! --><include file="$(find sunday_moveit_config)/launch/moveit_rviz.launch"><arg name="config" value="true" /></include><!-- We do not have a robot connected, so publish fake joint states --><node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher"><param name="/use_gui" value="false"/> <rosparam param="/source_list">[/sunday/joint_states]</rosparam></node></launch>
修改sunday_moveit_config/launch/moveit_rviz.launch,使用新版配置工具生成的moveit_rviz.launch文件有些许问题,代码如下:
<launch><arg name="debug" default="false" /><arg unless="$(arg debug)" name="launch_prefix" value="" />
<arg if="$(arg debug)" name="launch_prefix" value="gdb --ex run --args" /><arg name="config" default="false" /><arg unless="$(arg config)" name="command_args" default="" /><arg if="$(arg config)" name="command_args" default="-d $(find sunday_moveit_config)/launch/moveit.rviz" /><node name="$(anon rviz)" launch-prefix="$(arg launch_prefix)" pkg="rviz" type="rviz" respawn="false"args="$(arg command_args)" output="screen"><rosparam command="load" file="$(find sunday_moveit_config)/config/kinematics.yaml"/></node></launch>
配置总bringup.launch文件
配置sunday_gazebo/launch/sunday_moveit_bringup.launch,用于加载所有launch文件,代码如下:
<launch><!-- Launch Gazebo --><include file="$(find sunday_gazebo)/launch/sunday_gazebo_world.launch" /><!-- ros_control arm launch file --><include file="$(find sunday_gazebo)/launch/sunday_gazebo_states.launch" /> <!-- ros_control trajectory control dof arm launch file --><include file="$(find sunday_gazebo)/launch/sunday_trajectory_controller.launch" /><!-- moveit launch file --><include file="$(find sunday_moveit_config)/launch/moveit_planning_execution.launch"></include>
</launch>
至此gazebo与moveit功能包配置完毕,将功能包进行编译。sunday_gazebo列表如下
.
├── CMakeLists.txt
├── config
│ ├── sunday_gazebo_joint_states.yaml
│ └── sunday_trajectory_control.yaml
├── include
│ └── sunday_gazebo
├── launch
│ ├── sunday_bringup_moveit.launch
│ ├── sunday_gazebo_states.launch
│ ├── sunday_gazebo_world.launch
│ └── sunday_trajectory_controller.launch
├── package.xml
├── scripts
├── src
└── world└── feeding_place.world
world为配置好的抓取仿真场景。
联合仿真测试
运行代码roslaunch sunday_gazebo sunday_bringup_moveit.launch
,可以看到同时加载moveit和gazebo场景,在Query栏,将Goal State设置为scan_food,在Commands栏点击Plan & Execute,可以看到gazebo中的机械臂运行到scan_food姿态。
小结
至此moveit!与gazebo联合仿真配置完毕,配置原理部分不展开介绍,各位可以去古月居学习这部分的原理内容。接下去将讲解如何用yolo训练自己的数据集。
参考资料
1.古月居机械臂课程
相关文章:

从零开始的机械臂yolov5抓取gazebo仿真(四)
Moveit与Gazebo联合仿真 上一篇博客已经将moveit!配置完毕,然而想要让moveit!控制gazebo中的机械臂,还需要进行一些接口的配置。现在我们有的功能包为sunday_description、sunday_moveit_config这两个功能包。且已经配置好xacro文件,本篇内容…...

C++修炼之筑基期第一层——认识类与对象
文章目录🌷专栏导读🌷什么是面向对象?🌷类的引入🌷什么是类🌷类的定义方式🌷类的访问限定符与封装🌺访问限定符🌺封装🌷类的作用域🌷类的实例化&a…...

IT 运营监控工具
在技术复杂性日益增加、业务竞争激烈的挑战以及消费者对服务中断接受度降低的世界中,IT 运营效率已成为增长、利润和成功的关键。IT 宕机的影响在几十年前威胁较小,现在意味着价值数百万美元的损失,有时甚至会损失各种规模的组织的业务和声誉…...

java线程之Thread类的基本用法
Thread类的基本用法1. Thread类的构造方法2. Thread的几个常见属性常见属性线程中断等待一个线程小鱼在上一篇博客详细的讲解了如何创建线程,java使用Thread类来创建多线程,但是对于好多没有相关经验的人来说,比较不容易理解的地方在于操作系统调度的执行过程. 我们通过下面代码…...

【js】多分支语句练习(2)
个人名片: 😊作者简介:一名大一在校生,web前端开发专业 🤡 个人主页:python学不会123 🐼座右铭:懒惰受到的惩罚不仅仅是自己的失败,还有别人的成功。 🎅**学习…...

Redis与MySQL的双写一致性问题
Redis与MySQL的双写一致性问题更新缓存? 删除缓存?先更新缓存再更新数据库先更新数据库,再更新缓存先删除缓存再更新数据库先更新数据库,再删除缓存解决方案1. 重试2. 异步重试2.1 使用消息队列实现重试2.2 Binlog实现异步重试删除…...

Java基础:笔试题
文章目录Java 基础题目1. 如下代码输出什么?2. 当输入为2的时候返回值是多少?3. 如下代码输出值为多少?4. 给出一个排序好的数组:{1,2,2,3,4,5,6,7,8,9} 和一个数,求数组中连续元素的和等于所给数的子数组解析第一题第二题第三题第四题方案…...

spring三级缓存以及@Async产生循环引用
spring三级缓存以及Async产生循环引用spring三级缓存介绍三级缓存解除循环引用原理源码对应1、获取A,从三级缓存中获取,没有获取到2、构造A,将A置入三级缓存构造A(创建A实例)置入缓存3、注入属性,构造B扫描缓存实例的相关信息注入…...

【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(5)
目录 写在前面: 题目:P2036 [COCI2008-2009#2] PERKET - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述: 输入格式: 输出格式: 输入样例: 输出样例: 解题思路: 代码…...

【Unity3D】Unity3D中在创建完项目后自动创建文件夹列表
推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 随着项目开发的体量增大,要导入大量的素材、UI、模…...

如何设计一个锂电池充电电路(TP4056)
这个是个单节18650锂电池的充电模块,这个是个18650的锂电池,18指的是它的直径是18mm,65指的是它的高度为65mm。这个18650电池的标称电压是3.7V,电池充满时电压为4.2V,一般电池电压越高也就代表它所剩的电量越大。这种锂…...

Spark了解
目录 1 概述 2 发展 3 Spark和Hadoop 4 Spark核心模块 1 概述 Apache Spark是一个快速、通用、可扩展的分布式计算系统,最初由加州大学伯克利分校的AMPLab开发。 Spark可以处理大规模数据处理任务,包括批处理、迭代式算法、交互式查询和流处理等。Spa…...
c++STL急急急
文章目录cSTL急急急vector头文件扩容过程用法:size/emptyclear迭代器begin/endfront/backpush_back() 和 pop_back()queue头文件用法循环队列 queue用法优先队列 priority_queue用法stack头文件deque头文件deque中控器:用法set头文件用法迭代器begin/end…...

【C++学习】模板进阶——非类型模板参数 | 模板的特化 | 分离编译
🐱作者:一只大喵咪1201 🐱专栏:《C学习》 🔥格言:你只管努力,剩下的交给时间! 模板我们之前一直都在使用,尤其是在模拟STL容器的时候,可以说,模板…...

【C++】C++11新特性——可变参数模板|function|bind
文章目录一、可变参数模板1.1 可变参数的函数模板1.2 递归函数方式展开参数包1.3 逗号表达式展开参数包1.4 empalce相关接口函数二、包装器function2.1 function用法2.2 例题:逆波兰表达式求值2.3 验证三、绑定函数bind3.1 调整参数顺序3.2 固定绑定参数一、可变参数…...

ssm框架之spring:浅聊事务--JdbcTemplate
简介 JdbcTemplate 是 Spring 对 JDBC 的封装,目的是使JDBC更加易于使用,JdbcTemplate是Spring的一部分。JdbcTemplate 处理了资源的建立和释放,它帮助我们避免一些常见的错误,比如忘了总要关闭连接。他运行核心的JDBC工作流&…...

盘点Python那些简单实用的第三方库
文章目录前言关于本文使用 pip 命令下载第三方库1、phone 库(获取手机号码信息)2、geoip2 库(IP 检测功能)3、freegames 库(免费小游戏)4、jionlp 库(解析地址信息)5、pyqrcode 库&a…...
leetCode热题21-26 解题代码,调试代码和思路
前言 本文属于特定的六道题目题解和调试代码。 1 ✔ [160]相交链表 Easy 2023-03-17 171 2 ✔ [54]螺旋矩阵 Medium 2023-03-17 169 3 ✔ [23]合并K个排序链表 Hard 2022-12-08 158 4 ✔ [92]反转链表 II Medium 2023-03-01 155 5 ✔ [415]字符串相加 Easy 2023-03-14 150 6 …...

ChatGPT推出第四代GPT-4!不仅能聊天,还可以图片创作!
3月15日凌晨,OpenAI震撼发布了多模态预训练大模型 GPT-4。 根据官网发布的通告可以知道,GPT-4 实现了以下几个方面的飞跃式提升:强大的AI创作识图能力;文字输入限制提升至 2.5 万字;回答准确性显著提高;能够…...

二叉搜索树:AVL平衡
文章目录一、 二叉搜索树1.1 概念1.2 操作1.3 代码实现二、二叉搜索树的应用K模型和KV模型三、二叉搜索树的性能分析四、AVL树4.1 AVL树的概念4.2 AVL树的实现原理4.3 旋转4.4 AVL树最终代码一、 二叉搜索树 1.1 概念 二叉搜索树( Binary Search Tree,…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...