目录&索引
前言
机器人项目仿真需求,故学习 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 多一个反馈)
名称 | Topic | Service |
---|---|---|
通信方式 | 异步通信 | 同步通信 |
实现原理 | TCP/IP | TCP/IP |
通信模型 | Publish-Subscribe | Request-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 文件替换新版本就解决)
总结
对文章内容有不解,请随时留言。