ROS入门(六)——仿真机器人二(Xacro+Rviz+Arbotix小车运动)

2023-10-13 09:10

本文主要是介绍ROS入门(六)——仿真机器人二(Xacro+Rviz+Arbotix小车运动),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

所用的学习链接:

【奥特学园】ROS机器人入门课程《ROS理论与实践》零基础教程P252-270

【以上视频笔记见http://www.autolabor.com.cn/book/ROSTutorials/】

前文参考ROS入门(五)——仿真机器人一(URDF+Rviz)

一、介绍

1.Xacro作用

Xacro 是 XML Macros 的缩写,Xacro 是一种 XML 宏语言,是可编程的 XML。

对于一个机器人,我们往往会有多个相类似的组件,例如车子的左轮和右轮,直接编写URDF文件会导致代码量重复,因此我们需要Xacro来起到一种函数封装的作用。在Xacro中,一些参数可以设置为定量和变量,在创建时传入变量,可以实现相似组件的批量生成。

它也可以实现变量计算和求解,避免一些运算中的人力劳动。

2.目标

1.创建底座和车轮的xacro文件
2.编写摄像头和雷达的 xacro 文件
3.编写一个组合文件,组合底盘、摄像头与雷达
4.通过 launch 文件启动 Rviz 并显示模型

3.Xacro语法

(1)属性

  • 定义属性

即定义一些常量和数值,如小车高度、离地距离,在本次实操中数值固定。例如要定义PI=3.1415927

<xacro:property name="PI" value="3.1415927" />
  •  属性调用
${属性名称}
  • 算术运算
${数学表达式}

 (2)宏

  • 宏定义

即算法中的函数,可以对相同结构和属性进行封装.

<!-- 多参数之间使用空格分隔 -->
<xacro:macro name="宏名称" params="参数1 参数2 .."> .....
</xacro:macro>
  •  宏调用

调用创建好的宏,可以传入一批参数,和宏中定义的参数统一。

<xacro:宏名称 参数1="xxx" 参数2="yyy" ../>

(3)计算样例

 实现1+6=7的宏定义和宏调用

<robot name="t" xmlns:xacro="http://wiki.ros.org/xacro"><!-- 1.宏定义 --><xacro:macro name="getsum" params="num1 num2"><result value="${num1+num2}"/></xacro:macro><!-- 2.宏调用 --><xacro:getsum num1="1" num2="6"/>
</robot>

(4)组合样例

在完成单独组件的xacro文件编写后,我们会希望将更多组件组合在一起,拼接成一个完整的模型,则需要新生成一个用于组合的xacro文件,运行launch时直接调用该文件。

<robot name="xxx" xmlns:xacro="http://wiki.ros.org/xacro"><xacro:include filename="文件1.xacro" /><xacro:include filename="文件2.xacro" /><xacro:include filename="文件3.xacro" />....
</robot>

二、分别创建车体、摄像头和雷达

1.创建底座和车轮(车体)

在之前文章中生成的xacro文件夹中,我们创建一个表示车体的xacro文件【t1_car.xacro】

<!--1.利用xacro:property来封装常量2.利用宏构造相似车轮(左右轮相似、前后轮相似)
-->
<!-- 根标签,必须声明 xmlns:xacro -->
<robot name="my_base" xmlns:xacro="http://www.ros.org/wiki/xacro"><!-- 封装变量、常量 --><xacro:property name="PI" value="3.141" /><!-- 宏:黑色设置 --><material name="black"><color rgba="0.0 0.0 0.0 1.0" /></material><!-- 封装底盘属性 --><xacro:property name="base_footprint_radius" value="0.001" /> <!-- base_footprint 半径  --><xacro:property name="base_link_radius" value="0.1" /> <!-- base_link 半径 --><xacro:property name="base_link_length" value="0.08" /> <!-- base_link 长 --><xacro:property name="earth_space" value="0.015" /> <!-- 离地间距 --><!-- 底盘只有一个,直接编写 --><link name="base_footprint"><visual><geometry><sphere radius="${base_footprint_radius}" /></geometry></visual></link><link name="base_link"><visual><geometry><cylinder radius="${base_link_radius}" length="${base_link_length}" /></geometry><origin xyz="0 0 0" rpy="0 0 0" /><material name="yellow"><color rgba="0.5 0.3 0.0 0.5" /></material></visual></link><joint name="base_link2base_footprint" type="fixed"><parent link="base_footprint" /><child link="base_link" /><origin xyz="0 0 ${earth_space + base_link_length / 2 }" /></joint><!-- 驱动轮 --><!-- 驱动轮属性封装 --><xacro:property name="wheel_radius" value="0.0325" /> <!-- 半径 --><xacro:property name="wheel_length" value="0.015" /> <!-- 宽度 --><!-- 驱动轮宏实现 --><xacro:macro name="add_wheels" params="name flag"><link name="${name}_wheel"><visual><geometry><cylinder radius="${wheel_radius}" length="${wheel_length}" /></geometry><origin xyz="0.0 0.0 0.0" rpy="${PI / 2} 0.0 0.0" /><material name="black" /></visual></link><joint name="${name}_wheel2base_link" type="continuous"><parent link="base_link" /><child link="${name}_wheel" /><origin xyz="0 ${flag * base_link_radius} ${-(earth_space + base_link_length / 2 - wheel_radius) }" /><axis xyz="0 1 0" /></joint></xacro:macro><!-- 宏调用,添加左右轮 --><xacro:add_wheels name="left" flag="1" /><xacro:add_wheels name="right" flag="-1" /><!-- 支撑轮 --><!-- 支撑轮属性 --><xacro:property name="support_wheel_radius" value="0.0075" /> <!-- 支撑轮半径 --><!-- 支撑轮宏 --><xacro:macro name="add_support_wheel" params="name flag"><link name="${name}_wheel"><visual><geometry><sphere radius="${support_wheel_radius}" /></geometry><origin xyz="0 0 0" rpy="0 0 0" /><material name="black" /></visual></link><!-- 支撑轮和底盘的关节宏 --><joint name="${name}_wheel2base_link" type="continuous"><parent link="base_link" /><child link="${name}_wheel" /><origin xyz="${flag * (base_link_radius - support_wheel_radius)} 0 ${-(base_link_length / 2 + earth_space / 2)}" /><axis xyz="1 1 1" /></joint></xacro:macro><!-- 宏调用,添加前后支撑轮 --><xacro:add_support_wheel name="front" flag="1" /><xacro:add_support_wheel name="back" flag="-1" />
</robot>

2.创建摄像头

在之前文章中生成的xacro文件夹中,我们创建一个表示摄像头的xacro文件【t2_camera.xacro】

<!-- 摄像头相关的 xacro 文件 -->
<robot name="my_camera" xmlns:xacro="http://wiki.ros.org/xacro"><!-- 摄像头属性 --><xacro:property name="camera_length" value="0.01" /> <!-- 摄像头长度(x) --><xacro:property name="camera_width" value="0.025" /> <!-- 摄像头宽度(y) --><xacro:property name="camera_height" value="0.025" /> <!-- 摄像头高度(z) --><xacro:property name="camera_x" value="0.08" /> <!-- 摄像头安装的x坐标 --><xacro:property name="camera_y" value="0.0" /> <!-- 摄像头安装的y坐标 --><xacro:property name="camera_z" value="${base_link_length / 2 + camera_height / 2}" /> <!-- 摄像头安装的z坐标:底盘高度 / 2 + 摄像头高度 / 2  --><!-- 摄像头关节以及link --><link name="camera"><visual><geometry><box size="${camera_length} ${camera_width} ${camera_height}" /></geometry><origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" /><material name="black" /></visual></link><joint name="camera2base_link" type="fixed"><parent link="base_link" /><child link="camera" /><origin xyz="${camera_x} ${camera_y} ${camera_z}" /></joint>
</robot>

3.创建雷达

在之前文章中生成的xacro文件夹中,我们创建一个表示雷达的xacro文件【t3_laser.xacro】

<!--小车底盘添加雷达
-->
<robot name="my_laser" xmlns:xacro="http://wiki.ros.org/xacro"><!-- 雷达支架 --><xacro:property name="support_length" value="0.15" /> <!-- 支架长度 --><xacro:property name="support_radius" value="0.01" /> <!-- 支架半径 --><xacro:property name="support_x" value="0.0" /> <!-- 支架安装的x坐标 --><xacro:property name="support_y" value="0.0" /> <!-- 支架安装的y坐标 --><xacro:property name="support_z" value="${base_link_length / 2 + support_length / 2}" /> <!-- 支架安装的z坐标:底盘高度 / 2 + 支架高度 / 2  --><link name="support"><visual><geometry><cylinder radius="${support_radius}" length="${support_length}" /></geometry><origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" /><material name="red"><color rgba="0.8 0.2 0.0 0.8" /></material></visual></link><joint name="support2base_link" type="fixed"><parent link="base_link" /><child link="support" /><origin xyz="${support_x} ${support_y} ${support_z}" /></joint><!-- 雷达属性 --><xacro:property name="laser_length" value="0.05" /> <!-- 雷达长度 --><xacro:property name="laser_radius" value="0.03" /> <!-- 雷达半径 --><xacro:property name="laser_x" value="0.0" /> <!-- 雷达安装的x坐标 --><xacro:property name="laser_y" value="0.0" /> <!-- 雷达安装的y坐标 --><xacro:property name="laser_z" value="${support_length / 2 + laser_length / 2}" /> <!-- 雷达安装的z坐标:支架高度 / 2 + 雷达高度 / 2  --><!-- 雷达关节以及link --><link name="laser"><visual><geometry><cylinder radius="${laser_radius}" length="${laser_length}" /></geometry><origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" /><material name="black" /></visual></link><joint name="laser2support" type="fixed"><parent link="support" /><child link="laser" /><origin xyz="${laser_x} ${laser_y} ${laser_z}" /></joint>
</robot>

三、组件组合

方法一(不推荐):转换成urdf后组合

在xacro文件夹下打开继承终端,运行。

# rosrun xacro xacro xxx.xacro > xxx.urdf
rosrun xacro xacro t1_car.xacro > t1_xacro_car.urdf

此时将xacro转换为urdf文件,后在launch中调用。调用方式可参考ROS入门(五)——仿真机器人一(URDF+Rviz)

方法二(推荐):新建xacro组合文件

在完成单独组件的xacro文件编写后,我们会希望将更多组件组合在一起,拼接成一个完整的模型,则需要新生成一个用于组合的xacro文件,运行launch时直接调用该文件就可以将所有组件一起显示。

需要组合的xacro:

  • t1_car.xacro   【车体+车轮】
  • t2_camera.xacro  【摄像头】
  • t3_laser.xacro  【雷达】

新建一个t4_123combine.xacro文件,组合各个组件

<!-- 组合小车、摄像头、雷达 -->
<robot name="my_car_camera" xmlns:xacro="http://wiki.ros.org/xacro"><xacro:include filename="t1_car.xacro" /><xacro:include filename="t2_camera.xacro" /><xacro:include filename="t3_laser.xacro" />
</robot>

四、launch调用xacro并运行rviz

1.编辑launch文件

在launch文件夹下新建一个launch文件【t4_xacro.launch】

<launch><!-- 将 xacro 文件内容设置进参数服务器 --><!-- urdf调用方式 --><!-- <param name="robot_description" textfile="$(find urdf_rviz)/urdf/urdf/t1_car.urdf" /> --><!-- xacro调用方式 --><param name="robot_description" command="$(find xacro)/xacro $(find urdf_rviz)/urdf/xacro/t4_123combine.xacro" /><!-- 启动 rivz --><node pkg="rviz" type="rviz" name="rviz" args="-d $(find urdf_rviz)/config/t1_car.rviz" /><!-- <node pkg="rviz" type="rviz" name="rviz" /> --><!-- 启动机器人状态和关节状态发布节点 --><node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" output="screen" /><node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" output="screen" /><!-- 启动图形化的控制关节运动节点 --><node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" output="screen" />
</launch>

2.运行launch文件

①ctrl+shift+b编译

②打开新终端1

roscore

③打开新终端2

roslaunch urdf_rviz t4_xacro.launch

正常显示

五、小车运动(Arbotix)

1.安装Arbotix

下载源码

git clone https://github.com/vanadiumlabs/arbotix_ros.git

将下载好的文件夹复制到   工作空间/src  下

2.配置

(1)控制文件

src/config 目录下新建一个文件 control.yaml

# 该文件是控制器配置,一个机器人模型可能有多个控制器,比如: 底盘、机械臂、夹持器(机械手)....
# 因此,根 name 是 controller
controllers: {# 单控制器设置base_controller: {#类型: 差速控制器type: diff_controller,#参考坐标base_frame_id: base_footprint, #两个轮子之间的间距base_width: 0.2,#控制频率ticks_meter: 2000, #PID控制参数,使机器人车轮快速达到预期速度Kp: 12, Kd: 12, Ki: 0, Ko: 50, #加速限制accel_limit: 1.0 }
}

(2)launch 文件中配置 arbotix 节点

在launch文件夹中新建一个 t5_arbotix.launch 文件,文件内容:

<launch><!-- 将 xacro 文件内容设置进参数服务器 --><!-- urdf调用方式 --><!-- <param name="robot_description" textfile="$(find urdf_rviz)/urdf/urdf/t1_car.urdf" /> --><!-- xacro调用方式 --><param name="robot_description" command="$(find xacro)/xacro $(find urdf_rviz)/urdf/xacro/t4_123combine.xacro" /><!-- 启动 rivz --><node pkg="rviz" type="rviz" name="rviz" args="-d $(find urdf_rviz)/config/t1_car.rviz" /><!-- <node pkg="rviz" type="rviz" name="rviz" /> --><!-- 启动机器人状态和关节状态发布节点 --><node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" output="screen" /><node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" output="screen" /><!-- 集成 arbotix 运动控制节点,加载参数 --><node name="arbotix" pkg="arbotix_python" type="arbotix_driver" output="screen"><!-- <rosparam file="$(find 工作空间)/config/文件名.yaml" command="load" /> --><rosparam file="$(find urdf_rviz)/config/control.yaml" command="load" /><param name="sim" value="true" /></node>
</launch>
  • <node> 调用了 arbotix_python 功能包下的 arbotix_driver 节点
  • <rosparam> arbotix 驱动机器人运行时,需要获取机器人信息,可以通过 file 加载配置文件
  • <param> 在仿真环境下,需要配置 sim 为 true

3.启动

1.运行launch,打开rviz

roslaunch urdf_rviz t5_arbotix.launch

2.设置Fixed name为odom

3.Add添加odometry

4.设置odometry的Topic为/odom(展示运动轨迹)

5.检验

打开一个终端,输入

rostopic list

发现有一个/cmd_vel,说明发布 cmd_vel 话题消息控制小车运动了

6.运动起来

通过自定义线速度角速度,使小车自动运动

rostopic pub -r 10 /cmd_vel geometry_msgs/Twist '{linear: {x: 0.2, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.5}}'

 

这篇关于ROS入门(六)——仿真机器人二(Xacro+Rviz+Arbotix小车运动)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/202189

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

MySQL入门到精通

一、创建数据库 CREATE DATABASE 数据库名称; 如果数据库存在,则会提示报错。 二、选择数据库 USE 数据库名称; 三、创建数据表 CREATE TABLE 数据表名称; 四、MySQL数据类型 MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串类型 4.1 数值类型 数值类型 类型大小用途INT4Bytes整数值FLOAT4By