R2机器人加载棋盘与棋子模型,对urdf、sdf的解释(区分srdf)

1、概述

urdf、sdf、srdf文件都属于xml的规范格式,解释分别如下:
urdf(unified robot description format)叫做"统一机器人描述格式",主要目的就是提供一种尽可能通用的机器人描述规范,这样对于机器人的描述就可以互相移植,比较方便。

sdf(simulation description format)能够描述机器人、静态和动态物体、照明、地形甚至物理学的各方面的信息。sdf可以精确描述机器人的各类性质,除了传统的运动学特性之外,还可以为机器人定义传感器、表面属性、纹理、关节摩擦等,还提供了定义各种环境的方法,包括环境光照、地形,OpenStreetMaps中的街道以及The Prop Shop中提供的任何模型
从仿真角度讲,urdf文档不能描述不属于机器人的属性,即使其可能与机器人仿真十分相关,如环境光线、机器人在世界坐标系下的位姿、多个机器人之间的相对位姿等,算是对urdf的补充升级。

srdf(semantic robot description format)叫做"语义机器人描述格式",是MoveIt针对控制机器人关节运动使用的一种机器人描述文件格式。有兴趣的可以查阅:ROS仿真R2机器人之安装运行及MoveIt的介绍 
使用命令:

rosrun moveit_setup_assistant moveit_setup_assistant

就可以打开MoveIt辅助安装工具,其中就有加载和生成srdf文件的操作。主要内容包括,关节组(joint groups),默认状态配置(default robot configurations),额外的碰撞检测信息(additional collision checking information)额外的坐标系变换(additional transforms)等

我们重点来讲解下urdf对机器人的描述格式文件,连杆是带有质量属性的刚体,也就是不能发生形变,比如手臂,而关节是连接、限制两个刚体相对运动的结构,可以旋转,比如人的腕关节。关节也叫运动副。通过关节将连杆依次连接起来,就构成了一个个运动链,主要包括如下内容:

机器人模型的运动学与动力学描述
机器人的几何表示
机器人的碰撞模型 

2、urdf示例

 比如一个简单的描述如下:

<?xml version="1.0"?>
<robot name="mybot">  <link name="base_link">    <visual>      <geometry>        <cylinder length="0.8" radius="0.1"/>      </geometry>    </visual>  </link>
</robot>

那么这个机器人的名称叫mybot,link属性就是连杆的意思,所以是一根名为base_link的连杆,visual是可视化节点,geometry是几何学,对机器人关节的描述,这里就是该连杆的形状是cylinder圆柱体,其长度为0.8、横截面半径为0.1。
单位制度采用的是"米-千克-秒",所以上面的长度和半径的大小是0.8米和0.1米。

上面的示例是一个连杆,再来看一个带关节的连接两个连杆的机器人:

<?xml version="1.0"?>
<robot name="mybot2"><link name="link_0"><visual><geometry><cylinder length="0.8" radius="0.1"/></geometry></visual></link><link name="link_1"><visual><geometry><cylinder length="0.8" radius="0.1"/></geometry></visual></link><joint name="joint_0" type="revolute"><axis xyz="0 0 1"/><limit effort="100.0" lower="0.0" upper="0.5" velocity="0.5"/><origin rpy="0 0 0" xyz="0.0 0.0 0.3"/><parent link="link_0"/><child link="link_1"/></joint>
</robot>

这里可以看到增加了一个名为joint_0的关节,类型是revolute,也就是说是可以旋转的。定义中我们知道是用来连接两个连杆的,可以叫做父连杆和子连杆,这里的父连杆是名为link_0,子连杆是名为link_1。
其中类型除了revolute之外还包括以下几种:

continuous:旋转,不受限制
revolute:旋转,转动角度受到限制
prismatic:平滑的
fixed: 固定关节
floating: 浮动关节,允许六个自由度的运动

3、棋盘与棋子

接下来我们看下sdf在实际当中的应用,我们在仿真平台中看下如何给下棋机器人画一个棋盘和棋子。下面一些代码是沿着上一篇文章的一些代码,是针对机器人的一些操作,有兴趣的可以一起看过来

3.1、bash操作

cd ~/chessbot/src
gedit r2_cli.py
#!/usr/bin/env python
import sys,rospy,tf,moveit_commander,random
from geometry_msgs.msg import Pose,Point,Quaternionclass R2Wrapper:def __init__(self):self.group={'left':moveit_commander.MoveGroupCommander('left_arm'),'right':moveit_commander.MoveGroupCommander('right_arm')}def setPose(self,arm,x,y,z,phi,theta,psi):if arm!='left' and arm!='right':raise ValueError("unknow arm:'%s'"%arm)orient=Quaternion(*tf.transformations.quaternion_from_euler(phi,theta,psi))pose=Pose(Point(x,y,z),orient)self.group[arm].set_pose_target(pose)self.group[arm].go(True)if __name__=='__main__':moveit_commander.roscpp_initialize(sys.argv)rospy.init_node('r2_cli',anonymous=True)argv=rospy.myargv(argv=sys.argv)if len(argv)!=8:print('usage:r2_cli.py arm x y z phi theta psi')sys.exit(1)r2w=R2Wrapper()r2w.setPose(argv[1],*[float(num) for num in sys.argv[2:]])moveit_commander.roscpp_shutdown()
chmod u+x r2_cli.py
./r2_cli.py left 0.5 -0.5 1.3 3.14 -1.5 -1.57
./r2_cli.py right -0.4 -0.6 1.4 3.14 -1.5 -1.57
./r2_cli.py left 0.4 -0.4 1.2 3.14 -1.5 -1.57

这里是对机器人做一些移动操作,也可以将这些命令写入到bash文件中,r2.bash

#!/bin/bash
alias r2lhome="./r2_cli.py left 0.5 -0.5 1.3 3.14 -1.5 -1.57"
alias r2rhome="./r2_cli.py right -0.4 -0.6 1.4 3.14 -1.5 -1.57"
alias r2home="r2lhome;r2rhome"

然后通过source ./r2.bash 加载这些别名即可,这样就只需要输入 r2home,机器人就会规划一条通向起始位置的安全路径,并沿着它平滑地移动过去。对大多数机器人来说,一般都会设置一些常用的姿势,这样在日常操作、维护和任务当中都非常的实用方便。

启动一个空白的gazebo仿真界面

cd ~/chessbot
source devel/setup.bash
roslaunch gazebo_ros empty_world.launch

然后将R2机器人给加载进来

cd ~/chessbot
source devel/setup.bash
rosrun gazebo_ros spawn_model -file ~/chessbot/src/1.urdf -urdf -model r2

 接下来可以规划它运动了

cd ~/chessbot
source devel/setup.bash
roslaunch mybot move_group.launchcd ~/chessbot
source devel/setup.bash
cd ~/chessbot/src
source ./r2.bash
r2home

3.2、画棋盘

gedit chess_board.sdf
<?xml version='1.0'?>
<sdf version='1.4'>
<model name='box'>
<!--<pose frame=''>1 0 2 0 0 0</pose>--><static>true</static><link name='link'><collision name='collision'><geometry><box><size>0.5 0.5 0.02</size></box></geometry><surface><friction><ode><mu>0.1</mu><mu2>0.1</mu2></ode></friction><contact><ode><max_vel>0.1</max_vel><min_depth>0.001</min_depth></ode></contact></surface></collision><visual name='visual'><geometry><box><size>0.5 0.5 0.02</size></box></geometry></visual></link>
</model>
</sdf>

加载进来看下:

rosrun gazebo_ros spawn_model -file ~/chessbot/src/chess_board.sdf -sdf -model box

这里就是在sdf节点下,最常见的就是model节点,可以进行嵌套,这样就可以插入多个机器人了。可以看到节点属性比urdf多了,这也是其中一部分的节点,其余的还有light灯光效果,gravity重力加速度,scene场景参数,比如背景、阴影等,kinematic运动学等等。
其中static表示这个东西是静态的不能移动,pose可以自定义位姿,geometry里面定义物体的大小(长宽高),collision碰撞检测里面包括了常见的物理特性,friction摩擦力,里面定义两个摩擦系数,contact节点里面的max_vel表示接触的最大速度,min_depth表示接触的最小深度 

3.3、画棋子

gedit chess_piece.sdf
<?xml version='1.0'?>
<sdf version='1.4'>
<model name='piece'><link name='link'><inertial><mass>0.001</mass><inertial><ixx>0.0000001667</ixx><ixy>0</ixy><ixz>0</ixz><iyy>0.00000001667</iyy><izz>0.0000001667</izz></inertial></inertial><collision name='collision'><geometry><box><size>0.02 0.02 0.04</size></box></geometry><surface><friction><ode><mu>0.4</mu><mu2>0.4</mu2></ode></friction><contact><ode><max_vel>0.1</max_vel><min_depth>0.0001</min_depth></ode></contact></surface></collision><visual name='visual'><geometry><box><size>0.02 0.02 0.04</size></box></geometry></visual></link>
</model>
</sdf>

这里定义了棋子的质量mass为0.001,也就是1克,有一个惯性节点inertial,定义了物体的惯性矩阵,ixx, iyy, izz表示三个方向上的惯性,而ixy, ixz, iyz表示扭矩作用下的惯性力矩。
棋子比较多,我们使用代码循环生成棋子,落在棋盘上,这里会使用到服务,所以我们可以先来查看下有哪些服务列表:rosservice list,挺多的,如下图:

其中我们需要用到/gazebo/delete_model/gazebo/spawn_sdf_model 

gedit spawn_chessboard.py 
#!/usr/bin/env python
import sys,rospy,tf
from gazebo_msgs.srv import *
from geometry_msgs.msg import *
from copy import deepcopyif __name__=='__main__':rospy.init_node("spawn_chessboard")rospy.wait_for_service("gazebo/delete_model")rospy.wait_for_service("gazebo/spawn_sdf_model")delete_model=rospy.ServiceProxy("gazebo/delete_model",DeleteModel)delete_model("chessboard")s=rospy.ServiceProxy("gazebo/spawn_sdf_model",SpawnModel)orient=Quaternion(*tf.transformations.quaternion_from_euler(0,0,0))board_pose=Pose(Point(0.25,1.39,0.90),orient)unit=0.05with open("chess_board.sdf",'r') as f:board_xml=f.read()with open("chess_piece.sdf",'r') as f:piece_xml=f.read()print(s("chessboard",board_xml,"",board_pose,"world"))for row in [0,1,6,7]:for col in xrange(0,8):piece_name="piece_%d_%d"%(row,col)delete_model(piece_name)pose=deepcopy(board_pose)pose.position.x=board_pose.position.x-3.5*unit+col*unitpose.position.y=board_pose.position.y-3.5*unit+row*unitpose.position.z+=0.02s(piece_name,piece_xml,"",pose,"world")

这样就相当于先定位一个棋盘,然后就在棋盘中的对应位置,一个一个的画出棋子了。

加个可执行权限:chmod u+x spawn_chessboard.py
然后执行这个Python文件:./spawn_chessboard.p

success: True
status_message: "SpawnModel: Successfully spawned entity" 

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

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

相关文章

恭喜:ChatGPT之父与相恋多年的男友结婚,并希望早日生娃。。。

OpenAI CEO Sam Altman与伴侣Oliver Mulherin海边私密婚礼&#xff1a;爱情、事业与人工智能领域的交织 婚礼主持人是奥特曼的兄弟杰克奥尔特曼 壹.媒体流传 在科技界掀起波澜的OpenAI首席执行官萨姆奥尔特曼&#xff08;Sam Altman&#xff09;&#xff0c;近期与他长久以来的…

Opencv实验合集——实验九:姿势估计

在上一章节(相机校准)&#xff0c;你已经找到了相机矩阵&#xff0c;畸变系数等等参数。给出一个图案图像&#xff0c;我们便可以利用上面的信息用于计算其姿势&#xff0c;或者物体在空间中位于何处&#xff0c;比如如何旋转&#xff0c;如何移动等等问题。对于一个平面物体&a…

Java - FFM API 实现扫雷助手

文章目录 前言环境思路实现扫雷常量高度/宽度/雷数地图基址 屏幕坐标 效果资源 前言 使用 FFM API 实现扫雷助手. 环境 Win11 JDK 21 思路 读取扫雷地图数据判断该数据是否为雷模拟鼠标点击重复上面操作遍历地图直至完成 确定了思路&#xff0c;那么就要确认 windows 系…

Rust-模式解构

match 首先&#xff0c;我们看看使用match的最简单的示例&#xff1a; exhaustive 有些时候我们不想把每种情况一一列出&#xff0c;可以用一个下划线来表达“除了列出来的那些之外的其他情况”&#xff1a; 下划线 下划线还能用在模式匹配的各种地方&#xff0c;用来表示…

Java+Mysql存储过程生成订单序列号

Mysql存储过程生成唯一订单号 直接上代码&#xff01;&#xff01; 1.创建存储过程 CREATE DEFINERrootlocalhost PROCEDURE getOrderSerialNo(# 前缀in orderPrefix varchar(64), # 返回结果out result int) BEGIN# 当前流水号declare curOrderNo int;# 默认值为0declare e…

uniapp小程序超出一行显示...并展示更多按钮

注意:全部标签需要浮动在父盒子右边哦 循环获取所有需要展示数据标签的高度 this.goods this.goods.map(item > ({...item,showBtn: false}));this.$nextTick(() > {uni.createSelectorQuery().in(this).selectAll(".cart-info").boundingClientRect((data)…

yolov7中断训练后继续训练

1、训练指令 &#xff08;1&#xff09;添加resume参数&#xff0c;参数值改为true &#xff08;2&#xff09;weights参数&#xff0c;参数值改为中断前上次训练权重 中断后继续训练命令&#xff1a; python.exe train.py --weights runs/train/exp9/weights/last.pt --re…

SpringBoot3 WebFlux 可观测最佳实践

前言 链路追踪是可观测性软件系统的一个非常好的工具。它使开发人员能够了解应用程序中和应用程序之间不同交互发生的时间、地点和方式。同时让观测复杂的软件系统变得更加容易。 从Spring Boot 3开始&#xff0c;Spring Boot 中用于链路追踪的旧 Spring Cloud Sleuth 解决方…

Unity2022.3打包Android后从AB包加载场景发现丢失大量脚本问题

问题 这两天遇到一个问题&#xff0c;在VR项目打包Android的时候&#xff0c;加载场景后&#xff0c;Timeline工作不正常&#xff0c;找不到原因。 现象 看到有很多警告&#xff0c;丢失脚本的Log。 因为场景本身也有一些丢失的脚本所以没在意&#xff0c;但是又不是所有脚本…

计算机毕业设计-----SpringBoot招聘网站项目

项目介绍 SpringBoot招聘网站项目。主要功能说明&#xff1a; 管理员登录,简历管理,问答管理,职位管理,用户管理,职位申请进度更新,查看简历等功能。 用户角色包含以下功能&#xff1a;用户首页,登录注册,职位查看,职位详情,投递简历,查看我的申请,管理个人简历,附件简历管理…

紫光展锐M6780丨画质增强——更炫的视觉体验

智能显示被认为是推动数字化转型和创新的重要技术之一。研究机构数据显示&#xff0c;预计到2035年底&#xff0c;全球智能显示市场规模将达到1368.6亿美元&#xff0c;2023-2035年符合年增长率为36.4%。 随着消费者对高品质视觉体验的需求不断增加&#xff0c;智能手机、平板…

如何用ChatGPT写教案设计?以“沁园春雪”为例

1. 引言 随着人工智能技术的飞速发展&#xff0c;ChatGPT已成为教育领域的一大创新工具。ChatGPT不仅能够模拟人类对话&#xff0c;还可以帮助设计互动丰富、内容丰富的教案。本文将探索如何利用ChatGPT进行教案教学设计&#xff0c;特别是通过“沁园春雪”这一案例&#xff0…

基于反卷积方法的重大突破:结构光系统中的测量误差降低3倍

作者&#xff1a;小柠檬 | 来源&#xff1a;3DCV 在公众号「3DCV」后台&#xff0c;回复「原论文」可获取论文pdf 结构光三维测量技术在工业自动化、逆向工程和图形学领域越来越受欢迎。然而&#xff0c;现有的测量系统在成像过程中存在不完美&#xff0c;会导致在不连续边缘周…

【学习心得】Git深入学习

一、深入学习Git必须熟悉两个概念 &#xff08;1&#xff09;【四个区】Git本地有三个区&#xff0c;远程仓库也可以看出成一个区域 工作区、暂存区、本地仓库、远程仓库。 通过四句话来充分理解这三个区 第一句话&#xff1a;你创建的一个文件夹&#xff0c;并且将它初始化…

基于Java SSM框架实现体育竞赛成绩管理系统项目【项目源码+论文说明】

基于java的SSM框架实现体育竞赛成绩管理系统演示 摘要 体育竞赛是各种体育体育项目比赛的总称。是在裁判员的主持下&#xff0c;按统一的规则要求&#xff0c;组织与实施的体育员个体或体育队之间的竞技较量&#xff0c;是竞技体育与社会发生关联&#xff0c;并作用于社会的媒…

基于OpenCV的谷物颗粒识别

基于OpenCV的谷物颗粒识别 一、程序整体功能介绍1.1 导入库与函数定义1.2 颜色分割与灰度处理1.3 二值化与轮廓检测1.4 绘制与计数1.5 主程序与结果展示 二、算法原理与实现流程2.1算法原理&#xff08;1&#xff09;颜色分割&#xff08;2&#xff09;灰度处理与二值化&#x…

前端 TS 语法 接口(2)

介绍 TypeScript的核心原则之一是对值所具有的shape进行类型检查。 它有时被称做“鸭式辨型法”或“结构性子类型化”。 在TypeScript里&#xff0c;接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约。 只读属性 readonly 一些对象属性只能在对象刚刚创建的…

Java反转单链表

/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*/ //核心思想&#xff0c;利用cur和Curnex…

基础篇_数据持久化(实战-我的B站,MySQL数据库)

文章目录 一. 实战-我的B站1. 功能演示2. 设计数据类数据展示路径参数 3. 设计 Service 类静态资源映射读取文件的时机Stream API 改进 二. MySQL 数据库1. 数据库必要性2. MySQL 安装下载压缩包初始化数据库运行服务器运行客户端 3. 初步使用4. datagrip添加数据源导入数据用 …

HBase 基础

HBase 基础 HBase1. HBase简介1.1 HBase定义1.2 HBase数据模型1.2.1 HBase逻辑结构1.2.2 HBase物理存储结构1.2.3 数据模型 1.3 HBase基本架构 2. HBase环境安装2.1 HBase 安装部署2.1.1 HBase 本地按照2.1.2 HBase 伪分布模式安装2.1.3 HBase 集群安装 2.2 HBase Shell操作2.2…