技术分享 | ROS小实验——“圆龟”

Posted 阿木实验室

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了技术分享 | ROS小实验——“圆龟”相关的知识,希望对你有一定的参考价值。

最近呢,我们收到用户的反馈,虽然我们每期的微信公众号都有很不错的内容,但是好多文章都是只能看一看、学一学,很少可以上手实操体验。希望我们可以推出不仅可以学习,而且还能上手操作的一些内容文章,我们也是非常关心用户的需求,由此阿木推出一个新的文章系列——ROS小实验。“ROS小实验”系列针对ROS的初学者,整体内容偏简单,内容为讲解一个ROS下的小功能DEMO开发流程,每期我们都会推出一个不一样的小功能DEMO,涵盖ROS绝大部分知识点,大家能从中学习到ROS相关知识点,也能简单熟悉ROS的开发流程和一些技巧。

本期内容的主题为“圆龟”,大家都知道圆规是可以画圆的,但此圆龟非彼圆规,ROS下的小乌龟大家应该都比较熟悉,作为ROS官方教程御用教官,带领大部分学习从事于ROS的人员进入ROS的世界中,今天我们也将用这只小乌龟来画一个圆。

为了有一个良好的学习效果,建议大家有能力可以自己先试着开发如何用ROS下的小乌龟画圆,在遇到问题或者实现不了的情况下再看下面的内容。

从现在开始我们将进入“圆龟”的开发流程。

首先,可以先看一下官方的例程demo(http://wiki.ros.org/ROS/Tutorials/UnderstandingTopics)

该教程是让用户控制小乌龟移动,从而去理解ROS的一些概念,从这个教程中,我们可以看出小乌龟移动后是会留下一条白色轨迹,那么画圆就是让乌龟的运动轨迹是一个圆。

首先,我们依次启动下面三条命令,将控制小乌龟移动的功能demo启动。

$ roscore $ rosrun turtlesim turtlesim_node $ rosrun turtlesim turtle_teleop_key 使用方向键便可以控制小乌龟移动,接下来,我们就需要去剖析小乌龟移动背后的逻辑。 我们需要了解控制小乌龟移动的功能demo的节点信息,使用rqt_graph可视化工具查看。 如上图所示,可以知道teleop_turtle节点通过/turtle1/cmd_vel话题向turtlesim节点发布了速度控制数据。 通过 rostopic info /turtle1/cmd_vel命令可以发现该话题传输的消息类型为geometry_msgs/Twist类型。 再使用rosmsg show geometry_msgs/Twisit命令可以发现该消息的具体信息。 最后使用rostopic echo /turtle1/cmd_vel命令监听该话题的输出,再结合小乌龟的表现形式,不难发现,geometry_msgs/Twsit 消息类型的数据中,linear.x控制小乌龟前进或后退,angular.z控制小乌龟旋转。 到此为止,我们已经完全清楚小乌龟的节点信息,话题信息,消息信息以及控制接口等内容,接下来就只剩下如何去控制小乌龟运动了。 通过 v=rw 该公式我们可以清楚地认识到,当小乌龟具有一个固定的线速度和角速度时,就会有一个圆的运动轨迹,那么现在我们只需要编写一个ROS程序,向/turtle1/cmd_vel发布一个固定的线速度和角速度就可以实现“圆龟”了。

现在同学们可以根据上面的信息自行编写程序代码实现该功能,也可以参考下面的内容实现(例程以C++代码实现)。

  1. 创建工作空间 $ mkdir –p ~/amov_ws/src $ cd amov_ws/src $ catkin_init_workspace

  2. 创建功能包 $ cd ~/amov_ws/src $ catkin_create_pkg amov roscpp rospy

  3. 创建CPP文件 $ cd ~/amov_ws/src/amov/src $ gedit circle_turtle.cpp 将以下内容复制粘贴到该文件中,并保存退出 #include "ros/ros.h" #include "geometry_msgs/Twist.h"

int main(int argc, char** argv) {     ros::init(argc, argv, "circle_turtle");     ros::NodeHandle n;     ros::Publisher pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);     geometry_msgs::Twist twist;     twist.linear.x = 2.0;     twist.angular.z = 1.0;       ros::Rate r(10);     while(ros::ok())     {         pub.publish(twist);         r.sleep();     }     return 0; }

1. 修改CMakeLists.txt文件

在CMakeLists.txt文件中加入以下内容

add_executable(circle_turtle src/circle_turtle.cpp)

target_link_libraries(circle_turtle

${catkin_LIBRARIES} )

2. 编译 $ cd ~/amov_ws $ catkin_make 编译成功后进入下一步骤

3. 运行程序

打开三个终端,运行下面的指令

第一个终端 $ roscore

第二个终端 $ rosrun turtlesim turtlesim_node

第三个终端 $ source ~/amov_ws/devel/setup.bash $ rosrun amov circle_turtle 运行成功便会看到“圆龟”了

至此,“圆龟”小实验的内容就全部结束了,希望能对大家的ROS学习能有一定帮助,完成“圆龟”这个功能demo不是目的,通过“圆龟”让大家简单了解到ROS的开发流程、功能开发思路以及相关工具的使用才是最重要的。也希望大家能够举一反三,能够在“圆龟”的基础上玩出更多的花样。下一期我们将推出用服务的形式来实现不同半径和时间的“圆龟”,有兴趣的朋友们先尝试完成这样一个功能demo。 作者:阿木实验室-木十

  • End -

技术发展的日新月异,阿木实验室将紧跟技术的脚步,不断把机器人行业最新的技术和硬件推荐给大家。看到经过我们培训的学员在技术上突飞猛进,是我们培训最大的价值。如果你在机器人行业,就请关注我们的公众号,我们将持续发布机器人行业最有价值的信息和技术。 阿木实验室致力于前沿IT科技的教育和智能装备,让机器人研发更高效!

以上是关于技术分享 | ROS小实验——“圆龟”的主要内容,如果未能解决你的问题,请参考以下文章

技术分享 | ROS基础讲解之ROS相关名词概念讲解

技术分享 | 初学ROS这个重要概念,你必须要了解

技术分享 | apriltag_ros的基础讲解

技术分享 | 12个基础ROS常用命令讲解

技术分享 | 相较于ROS 1,ROS 2有哪些优越性?

技术分享 | ROS与Gazebo的通信机制