(仿真)创建 URDF 机器人模(1)

news2024/11/24 6:08:58

继上一篇基础篇的结束,不用看以前的也可以,这里是不受前面的影响的。

如果你没有这个目录,就创建一个catkin_ws文件夹 然后里面再一个src文件夹就ok了,我在基础篇第一篇的时候就有这个文件夹了,所有我现在是直接进入

cd ~/catkin_ws/src/
catkin_create_pkg abot_description URDF xacro

 进入abot_description目录里面

创建目录 

mkdir URDF meshes launch config

 解释:

URDF:存放机器人模型的 URDF 或 xacro 文件

meshes:放置 URDF 中引用的模型渲染文件

launch:保存相关启动文件

config:保存 rviz的配置文件

 

进入abot_description文件夹,然后vim abot_URDF.urdf 文件

复制代码,粘贴

<?xml version="1.0"?>   
<robot name="abot">
        <link name="base_link">
                <visual>
                        <origin xyz="0 0 0" rpy="0 0 0"/>
                        <geometry>
                                <box size="0.30 0.25 0.15"/> 
                        </geometry>
                        <material name="yellow">
                                <color rgba="1 0.4 0 1"/>
                        </material>
                </visual>
        </link> 
</robot>

 按esc 输入:wq 保存退出

退回上级目录,进入launch 目录,输入 vim  abot.launch 文件,复制代码粘贴。

<launch>
        <param name="robot_description" textfile="$(find abot_description)/URDF/abot_URDF.urdf" />
        <!--设置 GUI 参数,显示关节控制插件 -->
        <param name="use_gui" value="true"/>
        <!-- 运动 joint_state_publisher 节点,发布机器人关节状态 -->

        <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
        <!-- 运行 robot_state_publisher 节点,发布 TF -->

        <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
</launch>

 先执行命令。不然报错,没有package,如果不能执行命令,下载,就重启一下虚拟机吧,然后再下载。

sudo apt-get install ros-melodic-joint-*

 然后再运行launch文件

roslaunch abot_description abot.launch

 

 然后运行:

rosrun rviz rviz

 

 

 

 

 复制代码,覆盖掉abot.launch 文件

<launch>
        <param name="robot_description" textfile="$(find abot_description)/URDF/abot_URDF.urdf" />
        <!--设置 GUI 参数,显示关节控制插件 -->
        <param name="use_gui" value="true"/>
        <!-- 运动 joint_state_publisher 节点,发布机器人关节状态 -->

        <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
        <!-- 运行 robot_state_publisher 节点,发布 TF -->

        <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />


        <node name="rviz" pkg="rviz" type="rviz" args="-d $(find abot_description)/config/abot.rviz" required="true" />
</launch>

 

 执行命令:

 两个终端。roscore 是一直运行的,终端分别执行两个命令

roscore
roslaunch abot_description abot.launch

 效果:

编辑urdf 机器人模型文件

在 URDF 中添加机器人驱动轮,我给的是全部的代码,要么覆盖,要么选择复制

<?xml version="1.0"?>
<robot name="abot">
        <link name="base_link">
                <visual>
                        <origin xyz="0 0 0" rpy="0 0 0"/>
                        <geometry>
                                <box size="0.30 0.25 0.15"/>
                        </geometry>
                        <material name="yellow">
                                <color rgba="1 0.4 0 1"/>
                        </material>
                </visual>
        </link>


        <link name="left_front_link">
                <visual>
                        <origin xyz="0 0 0" rpy="1.5707 0 0"/>
                        <geometry>
                                <cylinder radius="0.04" length="0.025"/>
                        </geometry>
                        <material name="white">
                                <color rgba="1 1 1 0.9"/>
                        </material>
                </visual>
        </link>
        <joint name="left_front_joint" type="continuous">
                <origin xyz="0.10 0.15 -0.05" rpy="0 0 0"/>
                <parent link="base_link"/>
                <child link="left_front_link"/>
                <axis xyz="0 1 0"/>
        </joint>

</robot>

然后按esc 输入:wq 保存退出 

继续编辑urdf文件,添加另外的3个文件,我给出完整的文件了,直接复制,然后覆盖文件就可以了

<?xml version="1.0"?>
<robot name="abot">
	<link name="base_link">
		<visual>
			<origin xyz="0 0 0" rpy="0 0 0"/>
			<geometry>
				<box size="0.30 0.25 0.15"/>
			</geometry>
			<material name="yellow">
				<color rgba="1 0.4 0 1"/>
			</material>
		</visual>
	</link>


	<link name="left_front_link">
		<visual>
			<origin xyz="0 0 0" rpy="1.5707 0 0"/>
			<geometry>
				<cylinder radius="0.04" length="0.025"/>
			</geometry>
			<material name="white">
				<color rgba="1 1 1 0.9"/>
			</material>
		</visual>
	</link>
	<joint name="left_front_joint" type="continuous">
		<origin xyz="0.10 0.15 -0.05" rpy="0 0 0"/>
		<parent link="base_link"/>
		<child link="left_front_link"/>
		<axis xyz="0 1 0"/>
	</joint>

	<link name="left_back_link">
		<visual>
			<origin xyz="0 0 0" rpy="1.5707 0 0"/>
			<geometry>
				<cylinder radius="0.04" length="0.025"/>
			</geometry>
			<material name="white">
				<color rgba="1 1 1 0.9"/>
			</material>
		</visual>
	</link>
	<joint name="left_back_joint" type="continuous">
		<origin xyz="-0.10 0.15 -0.05" rpy="0 0 0"/>
		<parent link="base_link"/>
		<child link="left_back_link"/>
		<axis xyz="0 1 0"/>
	</joint>


	<link name="right_front_link">
		<visual>
			<origin xyz="0 0 0" rpy="1.5707 0 0"/>
			<geometry>
				<cylinder radius="0.04" length="0.025"/>
			</geometry>
			<material name="white">
				<color rgba="1 1 1 0.9"/>
			</material>
		</visual>
	</link>
	<joint name="right_front_joint" type="continuous">
		<origin xyz="0.10 -0.15 -0.05" rpy="0 0 0"/>
		<parent link="base_link"/>
		<child link="right_front_link"/>
		<axis xyz="0 1 0"/>
	</joint>





	<link name="right_back_link">
		<visual>
			<origin xyz="0 0 0" rpy="1.5707 0 0"/>
			<geometry>
				<cylinder radius="0.04" length="0.025"/>
			</geometry>
			<material name="white">
				<color rgba="1 1 1 0.9"/>
			</material>
		</visual>
	</link>
	<joint name="right_back_joint" type="continuous">
		<origin xyz="-0.10 -0.15 -0.05" rpy="0 0 0"/>
		<parent link="base_link"/>
		<child link="right_back_link"/>
		<axis xyz="0 1 0"/>
	</joint>
</robot>

执行命令:

roslaunch abot_description abot.launch


 在 URDF 中添加传感器(激光雷达和摄像头)

cp abot_URDF.urdf abot_with_laser.urdf

复制代码,直接覆盖abot_with_laser.urdf 文件,我已经弄好了的,自己弄进去应该会吧?shift+insert 粘贴

<?xml version="1.0"?>
<robot name="abot">
	<link name="base_link">
		<visual>
			<origin xyz="0 0 0" rpy="0 0 0"/>
			<geometry>
				<box size="0.30 0.25 0.15"/>
			</geometry>
			<material name="yellow">
				<color rgba="1 0.4 0 1"/>
			</material>
		</visual>
	</link>


	<link name="left_front_link">
		<visual>
			<origin xyz="0 0 0" rpy="1.5707 0 0"/>
			<geometry>
				<cylinder radius="0.04" length="0.025"/>
			</geometry>
			<material name="white">
				<color rgba="1 1 1 0.9"/>
			</material>
		</visual>
	</link>
	<joint name="left_front_joint" type="continuous">
		<origin xyz="0.10 0.15 -0.05" rpy="0 0 0"/>
		<parent link="base_link"/>
		<child link="left_front_link"/>
		<axis xyz="0 1 0"/>
	</joint>

	<link name="left_back_link">
		<visual>
			<origin xyz="0 0 0" rpy="1.5707 0 0"/>
			<geometry>
				<cylinder radius="0.04" length="0.025"/>
			</geometry>
			<material name="white">
				<color rgba="1 1 1 0.9"/>
			</material>
		</visual>
	</link>
	<joint name="left_back_joint" type="continuous">
		<origin xyz="-0.10 0.15 -0.05" rpy="0 0 0"/>
		<parent link="base_link"/>
		<child link="left_back_link"/>
		<axis xyz="0 1 0"/>
	</joint>


	<link name="right_front_link">
		<visual>
			<origin xyz="0 0 0" rpy="1.5707 0 0"/>
			<geometry>
				<cylinder radius="0.04" length="0.025"/>
			</geometry>
			<material name="white">
				<color rgba="1 1 1 0.9"/>
			</material>
		</visual>
	</link>
	<joint name="right_front_joint" type="continuous">
		<origin xyz="0.10 -0.15 -0.05" rpy="0 0 0"/>
		<parent link="base_link"/>
		<child link="right_front_link"/>
		<axis xyz="0 1 0"/>
	</joint>





	<link name="right_back_link">
		<visual>
			<origin xyz="0 0 0" rpy="1.5707 0 0"/>
			<geometry>
				<cylinder radius="0.04" length="0.025"/>
			</geometry>
			<material name="white">
				<color rgba="1 1 1 0.9"/>
			</material>
		</visual>
	</link>
	<joint name="right_back_joint" type="continuous">
		<origin xyz="-0.10 -0.15 -0.05" rpy="0 0 0"/>
		<parent link="base_link"/>
		<child link="right_back_link"/>
		<axis xyz="0 1 0"/>
	</joint>



	<link name="laser_link">
		<visual>
			<origin xyz="0 0 0" rpy="0 0 0"/>
			<geometry>
				<cylinder radius="0.04" length="0.040"/>
			</geometry>
			<material name="black">
				<color rgba="0 0 0 0.95"/>
			</material>
		</visual>
	</link>
	<joint name="laser_joint" type="fixed">
		<origin xyz="0 0 0.09" rpy="0 0 0"/>
		<parent link="base_link"/>
		<child link="laser_link"/>
	</joint>


</robot>

退出上一个目录,进入launch 目录 执行命令:

cp abot.launch abot_with_laser.launch

复制以下的代码,复制这个abot_with_laser.launch 文件 

<launch>
        <param name="robot_description" textfile="$(find abot_description)/URDF/abot_with_laser.urdf" />
        <!--设置 GUI 参数,显示关节控制插件 -->
        <param name="use_gui" value="true"/>
        <!-- 运动 joint_state_publisher 节点,发布机器人关节状态 -->

        <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
        <!-- 运行 robot_state_publisher 节点,发布 TF -->

        <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />


        <node name="rviz" pkg="rviz" type="rviz" args="-d $(find abot_description)/config/abot.rviz" required="true" />
</launch>

 

执行命令: 

roslaunch abot_description abot_with_laser.launch

继续,回到上一级目录进入URDF目录,我们再做一个urdf文件是有摄像头的,这里我给出全部的代码了。直接复制粘贴就好了。这次我们使用gedit 命令来编辑文件,可能需要等一点时间,这个比较慢

<?xml version="1.0"?>
<robot name="abot">
	<link name="base_link">
		<visual>
			<origin xyz="0 0 0" rpy="0 0 0"/>
			<geometry>
				<box size="0.30 0.25 0.15"/>
			</geometry>
			<material name="yellow">
				<color rgba="1 0.4 0 1"/>
			</material>
		</visual>
	</link>


	<link name="left_front_link">
		<visual>
			<origin xyz="0 0 0" rpy="1.5707 0 0"/>
			<geometry>
				<cylinder radius="0.04" length="0.025"/>
			</geometry>
			<material name="white">
				<color rgba="1 1 1 0.9"/>
			</material>
		</visual>
	</link>
	<joint name="left_front_joint" type="continuous">
		<origin xyz="0.10 0.15 -0.05" rpy="0 0 0"/>
		<parent link="base_link"/>
		<child link="left_front_link"/>
		<axis xyz="0 1 0"/>
	</joint>

	<link name="left_back_link">
		<visual>
			<origin xyz="0 0 0" rpy="1.5707 0 0"/>
			<geometry>
				<cylinder radius="0.04" length="0.025"/>
			</geometry>
			<material name="white">
				<color rgba="1 1 1 0.9"/>
			</material>
		</visual>
	</link>
	<joint name="left_back_joint" type="continuous">
		<origin xyz="-0.10 0.15 -0.05" rpy="0 0 0"/>
		<parent link="base_link"/>
		<child link="left_back_link"/>
		<axis xyz="0 1 0"/>
	</joint>


	<link name="right_front_link">
		<visual>
			<origin xyz="0 0 0" rpy="1.5707 0 0"/>
			<geometry>
				<cylinder radius="0.04" length="0.025"/>
			</geometry>
			<material name="white">
				<color rgba="1 1 1 0.9"/>
			</material>
		</visual>
	</link>
	<joint name="right_front_joint" type="continuous">
		<origin xyz="0.10 -0.15 -0.05" rpy="0 0 0"/>
		<parent link="base_link"/>
		<child link="right_front_link"/>
		<axis xyz="0 1 0"/>
	</joint>





	<link name="right_back_link">
		<visual>
			<origin xyz="0 0 0" rpy="1.5707 0 0"/>
			<geometry>
				<cylinder radius="0.04" length="0.025"/>
			</geometry>
			<material name="white">
				<color rgba="1 1 1 0.9"/>
			</material>
		</visual>
	</link>
	<joint name="right_back_joint" type="continuous">
		<origin xyz="-0.10 -0.15 -0.05" rpy="0 0 0"/>
		<parent link="base_link"/>
		<child link="right_back_link"/>
		<axis xyz="0 1 0"/>
	</joint>

	<link name="camera_link">
		<visual>
			<origin xyz="0 0 0" rpy="0 0 1.5707"/>
			<geometry>
				<box size="0.04 0.015 0.04"/>
			</geometry>
			<material name="black">
				<color rgba="0 0 0 0.9"/>
			</material>
		</visual>
	</link>
	<joint name="camera_joint" type="fixed">
		<origin xyz="0.13 0 0.09" rpy="0 0 0"/>
		<parent link="base_link"/>
		<child link="camera_link"/>
	</joint>
</robot>
cp abot_URDF.urdf abot_with_camera.urdf

 

 记得保存crtl+s

继续回到上一级目录,进入launch目录,然后执行命令,拷贝一个文件,填入下面的代码

<launch>
        <param name="robot_description" textfile="$(find abot_description)/URDF/abot_with_camera.urdf" />
        <!--设置 GUI 参数,显示关节控制插件 -->
        <param name="use_gui" value="true"/>
        <!-- 运动 joint_state_publisher 节点,发布机器人关节状态 -->

        <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
        <!-- 运行 robot_state_publisher 节点,发布 TF -->

        <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />


        <node name="rviz" pkg="rviz" type="rviz" args="-d $(find abot_description)/config/abot.rviz" required="true" />
</launch>

 然后执行代码

roslaunch abot_description abot_with_camera.launch

好了。记得给虚拟机拍摄快照哦。以后就可以回到这里了。如果后面的代码搞错了的话。

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

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

相关文章

【 计算机组成原理 】第七章 外围设备

系列文章目录 第一章 计算系统概论 第二章 运算方法和运算器 第三章 多层次的存储器 第四章 指令系统 第五章 中央处理器 第六章 总线系统 第七章 外围设备 第八章 输入输出系统 文章目录 系列文章目录前言第七章 外围设备7.1 外围设备概述7.1.1 外围设备的一般功能7.1.2 外围…

zabbix安装部署、三分钟分钟部署zabbix监控(超详细)

zabbix安装部署 1&#xff0c;快速安装部署zabbix2&#xff0c;一键脚本安装zabbix 1&#xff0c;快速安装部署zabbix 1&#xff0c;关闭防火墙&#xff0c;selinux systemctl stop firewalld systemctl disable firewalld setenforce 0 #临时 sed -i s/SELINUXenforcing/SE…

运维宝典大全

运维宝典大全 网络拓展Linux 概述什么是LinuxUnix和Linux有什么区别&#xff1f;什么是 Linux 内核&#xff1f;Linux的基本组件是什么&#xff1f;Linux 的体系结构BASH和DOS之间的基本区别是什么&#xff1f;Linux 开机启动过程&#xff1f;Linux系统缺省的运行级别&#xff…

Jmeter性能测试 -3 Jmeter使用中的一些问题

请求内容出现乱码的处理方法 1 内容编码&#xff1a;utf-8 2 请求头添加编码 Content-Type: application/json;charsetutf-8 3 请求体为参数类型时&#xff0c;勾选参数“编码”&#xff0c;编码为urlencoded编码。当参数值为非字符&#xff08;汉字、特殊符号&#xff09;时…

全面了解Java连接MySQL的基础知识,快速实现数据交互

全面了解Java连接MySQL的基础知识&#xff0c;快速实现数据交互 1. 数据库的重要性2. MySQL数据库简介2.1 MySQL数据库的基本概念2.2 MySQL的基本组成部分包括服务器、客户端和存储引擎。2.3 安装MySQL数据库2.3.1安装MySQL数据库2.3.2 下载MySQL安装程序2.3.3 运行MySQL安装程…

API接口|了解API接口测试|API接口测试指南

part1.什么是API接口 API接口是指应用程序接口&#xff08;Application Programming Interface&#xff09;&#xff0c;它是一组定义、控制和描述软件程序中不同组件之间交互的方式和规则。 API接口允许不同的软件系统之间进行信息共享和相互访问&#xff0c;而无需了解在其…

QT6之QTimeZone

一、简介 QTimeZone 标识时间表示与 UTC 的关系&#xff0c;也可以表示 UTC、本地时间和与 UTC 的固定偏移量。 QTimeZone&#xff08;自 Qt 6.5 起&#xff09;统一了它们与一般时间系统的表示&#xff0c;大多数操作系统普遍支持的一个时区被指定为本地时间。 总结&#x…

bim精装修常用软件【建模助手】有什么功能?

大家好&#xff0c;这里是BIM建模助手。 今天有个重磅消息要告诉大家&#xff0c;那就是BIM建模助手的【精装模块】上线啦&#xff01; 为了辅助BIMer快速设计出精装修的房屋效果&#xff0c;我们开发了【精装模块】&#xff0c;无论是装饰面层、铺排瓷砖、布置吊顶、统计出量…

chatgpt赋能Python-python_kazoo

Python Kazoo: 优质的分布式应用程序开发工具 什么是Python Kazoo&#xff1f; Python Kazoo是一个Python库&#xff0c;它提供了高级别的API&#xff0c;使得分布式应用程序的开发更加容易。Kazoo是基于Zookeeper实现的&#xff0c;它是一个分布式系统协调器&#xff0c;为分…

力扣sql中等篇练习(二十六)

力扣sql中等篇练习(二十六) 1 世界排名的变化 1.1 题目内容 1.1.1 基本题目信息1 1.1.2 基本题目信息2 1.1.3 示例输入输出 a 示例输入 b 示例输出 1.2 示例sql语句 # 分别求出变化前后的排名 然后再进行内连接即可 # row_number()里面也可以用多个字段加减的表达式去进行…

【C++】类和对象(3)

文章目录 一、初始化列表二、explicit关键字三、static成员四、友元4.1 友元函数4.2 友元类 五、内部类六、匿名对象七、编译器的优化 一、初始化列表 首先我们先回顾一下构造函数&#xff0c;对象的初始化由构造函数来完成&#xff0c;我们可以在构造函数的函数体内对对象的成…

00后卷王,把我们这些老油条卷的辞职信都写好了........

现在的小年轻真的卷得过分了。 前段时间我们公司来了个00年的&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。 后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天&#xff0c;原来这位小老弟家…

一个简单的c程序

有些基础知识点如果不经常温故可能就会忘记&#xff0c;难道是因为我已经老了吗&#xff1f;人要是老了&#xff0c;脑子是真的不好用了啊。今天看一个很简单的c代码&#xff1a; #include <stdio.h> #include <stdlib.h>typedef int eint32; typedef unsigned in…

基于数据库实现乐观锁

基于数据库实现乐观锁 一 乐观锁与悲观锁介绍二 乐观锁实践案例2.1 库存超卖问题复现2.1.1 模拟秒杀下单分析2.1.2秒杀代码2.1.3单元测试结果 2.2 库存超卖问题分析2.3 乐观锁解决超卖问题2.3.1版本号方式 案例源码案例中sql脚本 一 乐观锁与悲观锁介绍 悲观锁&#xff1a; 悲…

Java的文件操作和IO

目录 一、认识文件 树型结构组织 和 目录 文件路径&#xff08;Path&#xff09; 其他知识 二、Java 中操作文件 File 概述 属性 构造方法 文件内容的读写 —— 数据流 InputStream 概述 FileInputStream 概述 构造方法 代码示例 利用 Scanner 进行字符读取 Out…

Puppeteer 部署 - Docker容器 - Idea一键部署

Puppeteer 代码注意 部署到服务器&#xff0c;报错 Running as root without --no-sandbox is not supported.解决方案&#xff1a; const browser await puppeteer.launch({args: [--no-sandbox],env: {DISPLAY: ":10.0"}});Dockerfile 编写Dockerfile根据自己…

前后端交互 | 传递参数的方式

目录 GET请求两种方式 第一种&#xff1a;&#xff1f;& 形式 第二种:不使用&#xff1f;或者引号进行 传递参数 POST请求 小结&#xff1a; get和post的使用情况 传参数重复 传参数&#xff1a;目前共有三种传递参数的方式 GET请求两种方式 第一种&#xff1a;&…

史上最全BI知识全解,万字长文带你读懂BI

在各种新趋势的影响下&#xff0c;数字化不仅在当下有着强大的实力以及巨大的潜力&#xff0c;更是成为了未来世界的标志&#xff0c;成为了社会各界对未来发展的共识。企业为了执行数字化战略&#xff0c;实行数字化转型&#xff0c;实现数据价值&#xff0c;除了需要相关数字…

cpp综合项目—机房预约系统

目录 1、机房预约系统需求 1.1、 身份简介 1.2、机房简介 1.3、申请简介 1.4、 系统具体需求 2、创建项目 3、创建主菜单 3.1 菜单实现 3.2、接口实现 4、退出功能实现 4.1、退出功能实现 4.2、测试退出 5、创建身份类 5.1、身份的基类 5.2、学生类 5.3、老师类…

windows重装后恢复谷歌浏览器数据(旧的用户数据仍存在user data)

背景及注意前提&#xff01;&#xff01;&#xff01; 首先基于我笔记本被公司电脑加域之后&#xff0c;原先家庭版还被升级成了专业版&#xff0c;但是旧的user用户数据还都存在。只是变成了两个用户&#xff0c;开机默认是加域后的用户。 如果你的C盘已经完全被重写了&…