【ROS】通过 URDF 模型完成小车外形建模,rviz 图形化,ROS 新手必知必看


前言

机器人项目仿真需求,故学习 ROS gazebo,通过 URDF 模型完成小车外形建模。该篇文章,主要通过多个案例,进一步理解 ROS 文件系统运作及 Topic 通信架构,以案例分述。

网上 ROS 的资料不全——个人推荐,不确定就查官方文档 ROS Wiki,传送门

开发环境: ubuntu 18.04 + melodic + gazebo 9.0.0

  • 新建工程(重要),以自编写 launch 打开海龟及操控界面为例
  • rosrun 输出 hello launch
  • 双海龟 remap 同步,rqt_graph 查看节点信息调试
  • 发送主题修改龟行走路线、颜色、绝对位置(附 ROS 通信架构分析)
  • URDF 小车建模,rviz 图形化

案例一、新建工程(重要),以自编写 launch 打开海龟及操控界面为例

ROS 工程新建相对复杂,同其他工程新建,例子简述如下:

1、选择在家目录下创建工作空间,故到家目录,mkdir wsn_ws
2、进入到工作空间 wsn_ws,mkdir src 作为新建工程的父文件夹(这里以自编写 launch 打开 turtlesim 海龟及操控界面为例)
3、进入到工作空间 src,执行新建工程命令并添加依赖 catkin_create_pkg my_turtle roscpp rospy
4、进入到新建工程 my_turtle,mkdir launch 进入到 launch 编写 launch 启动文件 turtle_start_op.launch
5、回到 wsn_ws 工作空间,catkin_make 编译
6、刷新环境变量,或者 ~/.bashrc 下添加命令 source ~/wsn_ws/devel/setup.bash,原理启动 bash 即执行文件中配置
7、启动 launch 文件 roslaunch my_turtle turtle_start_op.launch,注意:launch 多节点都会被启动,通过 launch 启动,不需要单独 roscore 启动 master 节点。节点可理解为进程,可见 ROS 分布式软件架构

<!-- turtle_start_op.launch -->
<launch>
    <node pkg="turtlesim" name="turtlesim_node" type="turtlesim_node"/>
    <node pkg="turtlesim" name="turtle_teleop_key" type="turtle_teleop_key"/>
</launch>

小海龟如下:

在这里插入图片描述
launch 文件描述:

ROS 的“发动机”——launch 文件
机器人是一个系统工程,通常一个机器人运行操作时要开启很多个 node,对于一个复杂的机器人的启动操作应该怎么做呢?当然,我们并不需要每个节点依次进行 rosrun,ROS 为我们提供了一个命令能一次性启动 master 和多个 node,该命令是 roslaunch pkg_name file_name.launch


案例二、rosrun 输出 hello launch

基于案例一,研究新建的 my_turtle 工程下 CMakeLists.txt,真是没想到会在这里学 CMake 脚本。

// 编写 main.c 源文件
#include <stdio.h>

int main() {
    printf("from c: hello launch\n");
    return 0;
}

根据提示,解除其中的 1 行注释,修改内容,如下:

在这里插入图片描述

执行 rosrun,终端输出 hello launch,如下:

在这里插入图片描述


案例三、双海龟 remap 同步,rqt_graph 查看节点信息调试

新建的 my_turtle 工程下,创建两个 launch 文件,如下:

<!-- turtle_start.launch -->
<launch>
    <node pkg="turtlesim" name="sim1" type="turtlesim_node"/>
    <group ns="turtle_group">	
        <node pkg="turtlesim" name="sim2" type="turtlesim_node"/>
    </group>
</launch>
<!-- my_turtle_run.launch -->
<launch>
	<include file="$(find my_turtle)/launch/turtle_start.launch"/>
	<node pkg="turtlesim" name="mimic" type="mimic">
		<remap from="input" to="turtle1"/>
		<remap from="output" to="turtle_group/turtle1"/>
	</node>	
</launch>

均为 xml 格式,包含关系,故执行 my_turtle_run.launch,结果如下:

在这里插入图片描述
rqt_graph 查看节点信息,如下:

在这里插入图片描述


案例四、发送主题修改龟行走路线、颜色、绝对位置(附 ROS 通信架构分析)

这里首先明确我们的目标,我们要向 topic 发布内容,而这个命令是 rostopic pub topic_name ,可见我们需要知道向哪个 topic 发送,以及发送什么内容。

根据案例三 rqt_graph 显示的节点信息,选择 cmd_vel 主题(/turtle1 节点有 /turtle1/pose、/turtle1/cmd_vel;/turtle_group/turtle1 节点有 /turtle_group/turtle1/cmd_vel)。

/turtle1/color_sensor // 发布 turtle1 的颜色信息
/turtle1/cmd_vel // 接收线速度和角速度的控制信息
/turtle1/pose // 发布 turtle1 的位置信息

执行 rostopic type /turtle1/cmd_vel 查看 topic msg 类型,得到 geometry_msgs/Twist

接着执行 rosmsg show geometry_msgs/Twist ,查看某个 msg 的内容,

# rosmsg show geometry_msgs/Twist 执行,结果输出如下:
geometry_msgs/Vector3 linear
  float64 x
  float64 y
  float64 z
geometry_msgs/Vector3 angular
  float64 x
  float64 y
  float64 z

在这里插入图片描述
执行 rostopic pub /turtle1/cmd_vel geometry_msgs/Twist '{linear: {x: 0.1, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}' ,使小海龟直线移动,如下:

在这里插入图片描述

附:博主整理的 ROS 通信架构文档

主要作用:数据处理、进程运行管理、消息传递

Topic 主题(单向异步架构)、Service 服务(同步架构)、参数服务器与动作库(非架构,一种机制,动作库比 Service 多一个反馈)

名称TopicService
通信方式异步通信同步通信
实现原理TCP/IPTCP/IP
通信模型Publish-SubscribeRequest-Reply
映射关系Publish-Subscribe(多对多)Request-Reply(多对一)
特点接收者收到数据会回调(Callback)远程过程调用(RPC)服务器端的服务
应用场景连续、高频的数据发布偶尔使用的功能/具体的任务
举例激光雷达、里程计发布数据开关传感器、拍照、逆解过程

常用命令:

rosnode 命令

rosnode list // 列出当前运行的 node 信息

rosnode info node_name // 显示出 node 的详细信息

rosnode kill node_name // 结束某个 node

rosnode ping // 测试连接节点

rosnode machine // 列出在特定机器或列表机器上运行的节点

rosnode cleanup // 清除不可到达节点的注册信息

rostopic 命令(Topic 主题)

rostopic list // 列出当前所有的 topic

rostopic info topic_name // 显示 topic 的属性信息

rostopic echo topic_name // 显示 topic 的内容

rostopic pub topic_name // 向 topic 发布内容

rostoic bw topic_name // 查看 topic 的带宽

rostopic hz topic_name // 查看 topic 的频率

rostopic find topic_type // 查找类型 topic

rostopic type topic_name // 查看某个 topic 的 msg 类型

rosmsg 命令(Topic 主题)

rosmsg list // 列出系统上所有的 msg

rosmsg show msg_name // 显示某个 msg 的内容

rosservice 命令(Service 主题)

rosservice list // 显示服务列表

rosservice info // 打印服务信息

rosservice type // 打印服务类型

rosservice uri // 打印服务 ROSRPC uri

rosservice find // 按服务类型查找服务

rosservice call // 使用所提供的 args 调用服务

rosservice args // 打印服务参数

rossrv 命令(Service 主题)

rossrv show // 显示服务描述

rossrv list // 列出所有服务

rossrv md5 // 显示服务 md5sum

rossrv package // 列出包中的服务

rossrv packages // 列出包含服务的包


案例五、URDF 小车建模,rviz 图形化

有点顶不住了,写道题洗漱,之后再补充。

1、执行 catkin_create_pkg mybot_des urdf xacro 新建工程 mybot_des
2、创建 launch、urdf、meshes、config 文件夹
3、编写 launch、urdf、rviz
4、……(两个 WARNING,保留这张 WARNING 截图,读信息,修改 launch 文件替换新版本就解决)

在这里插入图片描述


总结

对文章内容有不解,请随时留言。


  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ROS小车的URDF模型可以根据具体的小车类型和设计进行创建,下面是一个简单的示例: ```xml <?xml version="1.0"?> <robot name="ros_car"> <!-- 定义小车的基座 --> <link name="base_link"> <visual> <geometry> <box size="0.5 0.3 0.2"/> </geometry> <origin rpy="0 0 0" xyz="0 0 0"/> <material name="blue"> <color rgba="0.2 0.2 0.8 1"/> </material> </visual> <collision> <geometry> <box size="0.5 0.3 0.2"/> </geometry> <origin rpy="0 0 0" xyz="0 0 0"/> </collision> <inertial> <mass value="1.0"/> <origin rpy="0 0 0" xyz="0 0 0"/> <inertia ixx="0.1" ixy="0.0" ixz="0.0" iyy="0.1" iyz="0.0" izz="0.1"/> </inertial> </link> <!-- 定义小车的轮子 --> <link name="wheel_link"> <visual> <geometry> <cylinder length="0.1" radius="0.05"/> </geometry> <origin rpy="0 1.5708 0" xyz="0 0 0"/> <material name="black"> <color rgba="0 0 0 1"/> </material> </visual> <collision> <geometry> <cylinder length="0.1" radius="0.05"/> </geometry> <origin rpy="0 1.5708 0" xyz="0 0 0"/> </collision> <inertial> <mass value="0.1"/> <origin rpy="0 0 0" xyz="0 0 0"/> <inertia ixx="0.0005" ixy="0.0" ixz="0.0" iyy="0.0005" iyz="0.0" izz="0.0005"/> </inertial> </link> <!-- 定义小车的轮子连接 --> <joint name="wheel_joint" type="continuous"> <parent link="base_link"/> <child link="wheel_link"/> <origin xyz="0.25 0 -0.1" rpy="0 0 0"/> <axis xyz="0 1 0"/> </joint> <!-- 定义小车的传感器 --> <link name="sensor_link"> <visual> <geometry> <cylinder length="0.05" radius="0.02"/> </geometry> <origin rpy="0 0 0" xyz="0.2 0 0"/> <material name="red"> <color rgba="1 0 0 1"/> </material> </visual> <collision> <geometry> <cylinder length="0.05" radius="0.02"/> </geometry> <origin rpy="0 0 0" xyz="0.2 0 0"/> </collision> <inertial> <mass value="0.05"/> <origin rpy="0 0 0" xyz="0 0 0"/> <inertia ixx="0.00005" ixy="0.0" ixz="0.0" iyy="0.00005" iyz="0.0" izz="0.00005"/> </inertial> </link> <!-- 定义小车的传感器连接 --> <joint name="sensor_joint" type="fixed"> <parent link="base_link"/> <child link="sensor_link"/> <origin xyz="0.25 0 0.1" rpy="0 0 0"/> </joint> </robot> ``` 在这个示例中,我们定义了一个名为"ros_car"的机器人,它由基座、轮子和传感器组成。基座由一个长方体表示,轮子由一个圆柱体表示,传感器由一个较小的圆柱体表示。连接由各自的关节表示。您可以根据您的小车类型和设计进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

idiot5liev

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值