《ROS2 机器人开发 从入门道实践》 鱼香ROS2——第6章内容

第6章 建模与仿真-创建自己的机器人

6.1 机器人建模与仿真概述

6.2使用URDF创建机器人

6.2.1 帮机器人创建一个身体

1. 新建文件chapt6/chapt6_ws/src/fishbot_description/urdf/

2. 新建文件first_robot.urdf

<?xml version="1.0"?>
<robot name = "first_robot"><!-- 机器人身体部分描述 --><link name="base_link"><!-- 部件外观描述 --><visual><!-- 沿着自己几何中心的偏移和旋转量 --><origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/><!-- 几何形状描述 --><geometry><cylinder radius="0.10" length="0.12"/></geometry><!-- 材料颜色,最后一个是透明度参数 --><material name="white"><color rgba="1.0 1.0 1.0 0.5"/></material></visual></link><!-- 机器人IMU部件,惯性测量单元 --><link name="imu_link"><visual><origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/><geometry><box size="0.02 0.02 0.02"/></geometry><material name="black"><color rgba="0.0 0.0 0.0 0.5"/></material></visual></link><!-- 机器人关节,用于组合机器人部件 --><joint name="imu_joint" type="fixed"><parent link="base_link"/><child link="imu_link"/><origin xyz="0.0 0.0 0.03" rpy="0.0 0.0 0.0"/></joint>
</robot>

 3. 在urdf目录下打开终端,执行urdf_to_graphviz first_robot.urdf,将会生成配置文件first_robot.gv和Created file first_robot.pdf

6.2.2 在RViz中显示机器人

1. 打开RViz,终端输入rviz2,点击add选择RobotMode,修改Description Source为File,从Description File中选择6.2.1中生成的first_robot.gv

2. 有报错,将Global Options的Fixed Frame改为base_link。还有IMU报错,需要通过消息发布建立部件之间的联系

3. 安装2个插件

sudo apt install ros-$ROS_DISTRO-joint-state-publishersudo apt install ros-$ROS_DISTRO-robot-state-publisher

 4. 新建文件chapt6/chapt6_ws/src/fishbot_description/launch/display_robot.launch.py

节点之间的订阅关系:

import launch
import launch_ros
from ament_index_python.packages import get_package_share_directory
import os
import launch_ros.parameter_descriptionsdef generate_launch_description():# 获取功能包安装目录urdf_package_path = get_package_share_directory("fishbot_description")# 拼接出first_robot.urdf路径default_urdf_path = os.path.join(urdf_package_path,'urdf','first_robot.urdf')# 拼接出保存的RViz配置文件,用于自动设置配置default_rviz_config_path = os.path.join(urdf_package_path,'config','display_robot_model.rviz')# 声明一个名为model的启动参数action_declare_arg_mode_path = launch.actions.DeclareLaunchArgument(name = 'model', default_value=str(default_urdf_path),description='加载的模型文件路径')# 获取URDF文件内容作为参数值。获取名为model的启动参数,Command会执行cat命令并将LaunchConfiguration获取的内容作为参数,# 通过value_type=str指定这个参数值的类型是字符串robot_description_value = launch_ros.parameter_descriptions.ParameterValue(launch.substitutions.Command(['cat ', launch.substitutions.LaunchConfiguration('model')]),value_type=str)# 状态发布节点,并将参数值付给=左边action_robot_state_publisher = launch_ros.actions.Node(package='robot_state_publisher',executable='robot_state_publisher',parameters=[{'robot_description':robot_description_value}])# 动态joint节点action_joint_state_publisher = launch_ros.actions.Node(package='joint_state_publisher',executable='joint_state_publisher',)# rviz启动节点+配置文件action_rviz_node = launch_ros.actions.Node(package='rviz2',executable='rviz2',arguments=['-d', default_rviz_config_path])return launch.LaunchDescription([action_declare_arg_mode_path,action_robot_state_publisher,action_joint_state_publisher,action_rviz_node])

5. source /home/dai/yuxiangros2/chapt6/chapt6_ws/install/setup.sh

6. 回到ws目录下,source install/setup.bash ,ros2 launch fishbot_description display_robot.launch.py 在launch目录下 ros2 launch display_robot.launch.py  --debug

7. 此时打开RViz会有红色报错,因为 左侧最上面默认坐标系为map,需要手动修改其他已有的坐标系

8. 将RViz配置文件保存至chapt6/chapt6_ws/src/fishbot_description/config

# 添加保存出来的RViz配置文件
default_rviz_config_path = os.path.join(urdf_package_path,'config','display_robot_model.rviz')# 启动rviz
action_rviz_node = launch_ros.actions.Node(package='rviz2',executable='rviz2',arguments=['-d', default_rviz_config_path]
)

修改CMakeLists.txt,添加config

install(DIRECTORY launch urdf configDESTINATION share/${PROJECT_NAME}
)

8. 再次colcon build,运行ros2 launch fishbot_description display_robot.launch.py即可加载配置文件

6.2.3 使用Xacro简化URDF

1. 安装插件 sudo apt install ros-$ROS_DISTRO-xacro

2. 新建文件chapt6/chapt6_ws/src/fishbot_description/urdf/first_robot.xacro,将名字、参数都设置为变量

<?xml version="1.0"?>
<robot xmlns:xacro = "http://www.ros.org/wiki/xacro" name = "first_robot"><!-- 把base_link声明为宏 --><xacro:macro name = "base_link" params = "length radius"><link name="base_link"><visual><origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/><geometry><cylinder radius="${radius}" length="${length}"/></geometry><material name="white"><color rgba="1.0 1.0 1.0 0.5"/></material></visual></link></xacro:macro><xacro:macro name = "imu_link" params = "imu_name xyz"><link name="${imu_name}_link"><visual><origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/><geometry><box size="0.02 0.02 0.02"/></geometry><material name="black"><color rgba="0.0 0.0 0.0 0.5"/></material></visual></link><joint name="${imu_name}_joint" type="fixed"><parent link="base_link"/><child link="${imu_name}_link"/><origin xyz="${xyz}" rpy="0.0 0.0 0.0"/></joint></xacro:macro><!-- 参数赋值 --><xacro:base_link length = "0.12" radius = "0.1"/><xacro:imu_link imu_name = "imu_up" xyz = "0.0 0.0 0.03"/><xacro:imu_link imu_name = "imu_down" xyz = "0.0 0.0 -0.03"/></robot>

3. 执行功能包

xacro 根目录/yuxiangros2/chapt6/chapt6_ws/src/fishbot_description/urdf/first_robot.xacro

 4. 同步骤3,也可以用6.2.3中类似于cat的命令执行功能包,新建文件chapt6/chapt6_ws/src/fishbot_description/launch/display_robot_xacro.launch.py

内容复制display_robotlaunch.py,将“cat空格”改为“xacro空格”

5. 编译、source、在ws路径下终端执行

ros2 launch fishbot_description display_robot_xacro.launch.py model:=根目录/yuxiangros2/chapt6/chapt6_ws/src/fishbot_description/urdf/first_robot.xacro
# 完整路径通过first_robot.xacro右键获取

6.2.4 创建机器人及传感器部件

1. 新建文件base.urdf.xacro,用于声明机器人身体

<?xml version="1.0"?>
<robot xmlns:xacro = "http://www.ros.org/wiki/xacro"><xacro:macro name = "base_xacro" params = "length radius"><link name="base_link"><visual><origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/><geometry><cylinder radius="${radius}" length="${length}"/></geometry><material name="white"><color rgba="1.0 1.0 1.0 0.5"/></material></visual></link></xacro:macro></robot>

2. 创建sensor文件夹和文件imu.urdf.xacro

<?xml version="1.0"?>
<robot xmlns:xacro = "http://www.ros.org/wiki/xacro"><xacro:macro name = "imu_xacro" params = "xyz"><link name="imu_link"><visual><origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/><geometry><box size="0.02 0.02 0.02"/></geometry><material name="black"><color rgba="0.0 0.0 0.0 0.5"/></material></visual></link><joint name="imu_joint" type="fixed"><parent link="base_link"/><child link="imu_link"/><origin xyz="${xyz}" rpy="0.0 0.0 0.0"/></joint></xacro:macro></robot>

3. sensor下新建文件camera.urdf.xacro

<?xml version="1.0"?>
<robot xmlns:xacro = "http://www.ros.org/wiki/xacro"><xacro:macro name = "camera_xacro" params = "xyz"><link name="camera_link"><visual><origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/><geometry><box size="0.02 0.02 0.02"/></geometry><material name="black"><color rgba="0.0 0.0 0.0 0.5"/></material></visual></link><joint name="camera_joint" type="fixed"><parent link="base_link"/><child link="camera_link"/><origin xyz="${xyz}" rpy="0.0 0.0 0.0"/></joint></xacro:macro></robot>

4. sensor下新建文件laser.urdf.xacrol

<?xml version="1.0"?>
<robot xmlns:xacro = "http://www.ros.org/wiki/xacro"><xacro:macro name = "laser_xacro" params = "xyz"><!-- 添加支撑杆用于安装雷达 --><link name="laser_cylinder_link"><visual><origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/><geometry><cylinder radius="0.01" length="0.10"/></geometry><material name="black"><color rgba="0.0 0.0 0.0 1.0"/></material></visual></link><!-- 雷达描述 --><link name="laser_link"><visual><origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/><geometry><cylinder radius="0.02" length="0.02"/></geometry><material name="black"><color rgba="0.0 0.0 0.0 1.0"/></material></visual></link><!-- 雷达和支撑杆 --><joint name="laser_joint" type="fixed"><parent link="laser_cylinder_link"/><child link="laser_link"/><origin xyz="0.0 0.0 0.05" rpy="0.0 0.0 0.0"/></joint><!-- 支撑杆和机器人身体 --><joint name="laser_cylinder_joint" type="fixed"><parent link="base_link"/><child link="laser_cylinder_link"/><origin xyz="${xyz}" rpy="0.0 0.0 0.0"/></joint></xacro:macro></robot>

 7. urdf下新建fishbot.urdf.xacro

<?xml version="1.0"?>
<robot xmlns:xacro = "http://www.ros.org/wiki/xacro" name = "fishbot"><xacro:include filename="$(find fishbot_description)/urdf/fishbot/base_urdf.xacro"/>
<xacro:include filename="$(find fishbot_description)/urdf/fishbot/sensor/camera.urdf.xacro"/>
<xacro:include filename="$(find fishbot_description)/urdf/fishbot/sensor/imu.urdf.xacro"/>
<xacro:include filename="$(find fishbot_description)/urdf/fishbot/sensor/laser.urdf.xacro"/><xacro:base_xacro length="0.12" radius="0.10"/></robot>

8. 运行功能包

xacro 根目录/yuxiangros2/chapt6/chapt6_ws/install/fishbot_description/share/fishbot_description/urdf/first_robot.xacro
#目录是install下的路径,不是原文件的路径

 9. 修改传感器位置

<?xml version="1.0"?>
<robot xmlns:xacro = "http://www.ros.org/wiki/xacro" name = "fishbot"><xacro:include filename="$(find fishbot_description)/urdf/fishbot/base.urdf.xacro"/>
<xacro:include filename="$(find fishbot_description)/urdf/fishbot/sensor/camera.urdf.xacro"/>
<xacro:include filename="$(find fishbot_description)/urdf/fishbot/sensor/imu.urdf.xacro"/>
<xacro:include filename="$(find fishbot_description)/urdf/fishbot/sensor/laser.urdf.xacro"/><xacro:base_xacro length="0.12" radius="0.10"/>
<xacro:imu_xacro xyz = "0.0 0.0 0.02"/>
<xacro:camera_xacro xyz="0.10 0.0 0.075"/>
<xacro:laser_xacro xyz="0.0 0.0 0.10"/>
</robot>

10. 运行

ros2 launch fishbot_description display_robot_xacro.launch.py model:=/home/dai/yuxiangros2/chapt6/chapt6_ws/install/fishbot_description/share/fishbot_description/urdf/fishbot/fishbot.urdf.xacro
# 复制了一个副本display_robot_xacro.launch.py(xacro执行命令行)
# 不是视频中的display_robot.launch.py(cat执行命令行)

6.2.5 完善机器人执行器部件

6.2.6 贴合地面,添加虚拟部件

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

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

相关文章

Postman接口测试03|执行接口测试、全局变量和环境变量、接口关联、动态参数、断言

目录 七、Postman 1、安装 2、postman的界面介绍 八、Postman执行接口测试 1、请求页签 3、响应页签 九、Postman的环境变量和全局变量 1、创建环境变量和全局变量可以解决的问题 2、postman中的操作-全局变量 1️⃣手动设置 2️⃣代码设置 3️⃣界面获取 4️⃣代…

【巨实用】Git客户端基本操作

本文主要分享Git的一些基本常规操作&#xff0c;手把手教你如何配置~ ● 一个文件夹中初始化Git git init ● 为了方便以后提交代码需要对git进行配置&#xff08;第一次使用或者需求变更的时候&#xff09;&#xff0c;告诉git未来是谁在提交代码 git config --global user.na…

下载导出Tomcat上的excle文档,浏览器上显示下载

目录 1.前端2.Tomcat服务器内配置3.在Tomcat映射的文件内放置文件4.重启Tomcat&#xff0c;下载测试 1.前端 function downloadFile() {let pictureSourceServer "http://192.168.1.1:8080/downFile/";let fileName "测试文档.xlsx";let fileURL pictu…

spring boot发送邮箱,java实现邮箱发送(邮件带附件)3中方式【保姆级教程一,代码直接用】

文章目录 Java发送邮箱的方式1. 基于 Javax.mail 实现关于附件上传的方法 2. 基于 org.apache.commons.mail 实现常见报错 3. 基于 spring-boot-starter-mail 实现&#xff08;推荐&#xff09; 实际开发时需要实现邮件发送&#xff0c;本文章实现如何从零实现邮件发送。也就是…

计算机网络期末复习(知识点)

概念题 在实际复习之前&#xff0c;可以看一下这个视频将网络知识串一下&#xff0c;以便更好地复习&#xff1a;【你管这破玩意叫网络&#xff1f;】 网络规模的分类 PAN&#xff08;个人区域网络&#xff09;&#xff1a;用于个人设备间的连接&#xff0c;如手机与蓝牙耳机…

Autoencoder(李宏毅)机器学习 2023 Spring HW8 (Boss Baseline)

1. Autoencoder 简介 Autoencoder是一种用于学习数据高效压缩表示的人工神经网络。它由两个主要部分组成: Encoder 编码器将输入数据映射到一个更小的、低维空间中的压缩表示,这个空间通常称为latent space或bottleneck。 这一过程可以看作是数据压缩,去除冗余信息,仅保留…

LLaMA-Factory web微调大模型并导出大模型

LLaMA-Factory 开源大模型如LLaMA&#xff0c;Qwen&#xff0c;Baichuan等主要都是使用通用数据进行训练而来&#xff0c;其对于不同下游的使用场景和垂直领域的效果有待进一步提升&#xff0c;衍生出了微调训练相关的需求&#xff0c;包含预训练&#xff08;pt&#xff09;&am…

一个基于Spring Boot的智慧养老平台

以下是一个基于Spring Boot的智慧养老平台的案例代码。这个平台包括老人信息管理、健康监测、紧急呼叫、服务预约等功能。代码结构清晰&#xff0c;适合初学者学习和参考。 1. 项目结构 src/main/java/com/example/smartelderlycare├── controller│ ├── ElderlyCon…

cmake - build MS STL project

文章目录 cmake - build MS STL project概述笔记END cmake - build MS STL project 概述 MS在github上开源了VS IDE 用的STL实现。 想看看微软的测试用例中怎么用STL. 想先用CMake编译一个MS STL发布版出来。 笔记 CMake需要3.30以上, 拟采用 cmake-3.30.6-windows-x86_64.…

【算法与数据结构】—— 回文问题

回文问题 目录 1、简介2、经典的回文问题(1) 判断一个字符串是否为回文(2) 给定字符集求构建的最长回文长度(3) 求最长回文子串方法一&#xff1a;中心拓展方法二&#xff1a;Manacher 算法 (4) 求回文子串的数目方法一&#xff1a;中心拓展方法二&#xff1a;Manacher 算法 1、…

Linux第一个系统程序---进度条

进度条---命令行版本 回车换行 其实本质上回车和换行是不同概念&#xff0c;我们用一张图来简单的理解一下&#xff1a; 在计算机语言当中&#xff1a; 换行符&#xff1a;\n 回车符&#xff1a;\r \r\n&#xff1a;回车换行 这时候有人可能会有疑问&#xff1a;我在学习C…

西电-神经网络基础与应用-复习笔记

此为24年秋研究生课程复习笔记 导论 神经网络的研究方法分为 连接主义&#xff0c;生理学派&#xff0c;模拟神经计算。高度的并行、分布性&#xff0c;很强的鲁棒和容错性。便于实现人脑的感知功能(音频图像的识别和处理)。符号主义&#xff0c;心理学派&#xff0c;基于符号…

利用obs studio制作(人像+屏幕)录制影像

1.什么是obs? OBS&#xff08;Open Broadcaster Software&#xff09;是一款功能强大的开源软件&#xff0c;它使用户能够直接从电脑录制视频和直播内容到 Twitch&#xff0c;YouTube 和 Facebook Live 等平台。它在需要直播或录制屏幕活动的游戏玩家、YouTube 用户和专业人士…

maven多模块项目编译一直报Failure to find com.xxx.xxx:xxx-xxx-xxx:pom:1.0-SNAPSHOT in问题

工作中项目上因为多版本迭代&#xff0c;需要对不同迭代版本升级版本号&#xff0c;且因为项目工程本身是多模块结构&#xff0c;且依然多个其他模块工程。 在将工程中子模块的pom.xml中版本号使用变量引用父模块中定义的版本号时&#xff0c;一直报Failure to find com.xxx.x…

音视频入门基础:RTP专题(2)——使用FFmpeg命令生成RTP流

通过FFmpeg命令可以将一个媒体文件转推RTP&#xff1a; ffmpeg -re -stream_loop -1 -i input.mp4 -c:v copy -an -f rtp rtp://192.168.0.102:5400 但是通过ffplay尝试播放上述产生的RTP流时会报错&#xff1a;“Unable to receive RTP payload type 96 without an SDP file …

Nacos 3.0 Alpha 发布,在安全、泛用、云原生更进一步

自 2021 年发布以来&#xff0c;Nacos 2.0 在社区的支持下已走过近三年&#xff0c;期间取得了诸多成就。在高性能与易扩展性方面&#xff0c;Nacos 2.0 取得了显著进展&#xff0c;同时在易用性和安全性上也不断提升。想了解更多详细信息&#xff0c;欢迎阅读我们之前发布的回…

C语言gdb调试

目录 1.gdb介绍 2.设置断点 2.1.测试代码 2.2.设置函数断点 2.3.设置文件行号断点 2.4.设置条件断点 2.5.多线程调试 3.删除断点 3.1.删除指定断点 3.2.删除全部断点 4.查看变量信息 4.1.p命令 4.2.display命令 4.3.watch命令 5.coredump日志 6.总结 1.gdb介绍…

【xLua】xLua-master签名、加密Lua文件

GitHub - Tencent/xLua: xLua is a lua programming solution for C# ( Unity, .Net, Mono) , it supports android, ios, windows, linux, osx, etc. 如果你想在项目工程上操作&#xff0c;又发现项目工程并没导入Tools&#xff0c;可以从xLua-master工程拷贝到项目工程Assets…

9.4 visualStudio 2022 配置 cuda 和 torch (c++)

一、配置torch 1.Libtorch下载 该内容看了【Libtorch 一】libtorchwin10环境配置_vsixtorch-CSDN博客的博客&#xff0c;作为笔记用。我自己搭建后可以正常运行。 下载地址为windows系统下各种LibTorch下载地址_libtorch 百度云-CSDN博客 下载解压后的目录为&#xff1a; 2.vs…

Python基于YOLOv8和OpenCV实现车道线和车辆检测

使用YOLOv8&#xff08;You Only Look Once&#xff09;和OpenCV实现车道线和车辆检测&#xff0c;目标是创建一个可以检测道路上的车道并识别车辆的系统&#xff0c;并估计它们与摄像头的距离。该项目结合了计算机视觉技术和深度学习物体检测。 1、系统主要功能 车道检测&am…