ROS运行程序让小海龟实现圆周运动
文章目录
一.任务简介
- 1.运行小海龟demo例子,通过键盘控制小海龟运动
- 2.用话题查看器查看两个node之间的消息传递
- 3.用C++写一个程序,控制小海龟走一个圆形
二.实验准备
- 1.VMware workstation 软件
- 2.Ubuntu 20.04版本
- 3.ROS
实验分析:
- 1.乌龟运动控制实现,关键节点有两个,一个是乌龟运动显示节点
turtlesim_node
,另一个是控制节点
,二者是订阅发布模式
实现通信的,乌龟运动图形化显示节点直接调用即可,运动控制节点之前是使用的turtle_teleop_key
通过键盘 控制
,现在需要自定义控制节点
。- 2.控制节点自实现时,首先需要了解控制节点与显示节点通信使用的
话题与消息
,可以使用ros命令
结合计算图
来获取。- 3.了解了话题与消息之后,通过
C++
或Python
编写运动控制节点,通过指定的话题
,按照一定的逻辑发布消息即可。
一.运行ROS,以键盘控制小海龟移动.
- 这里在我上一篇文章最后一部分已经有过介绍,这里就不过多介绍了:上一篇文章
二.了解ROS话题与消息的发布与获取的方式.终端命令发布话题控制海龟圆周运动.
1.话题与消息获取:
准备: 先启动键盘控制乌龟运动案例。
①话题获取:
②消息获取:
③获取消息格式:
- 乌龟线速度取值只有x和角速度z
- 因为只有前后左右四个键位控制运动
- 可以看到只有线速度x和角速度y
- 因为只有上下左右四个键
- 上下控制线速度x,左右控制角速度z
④实现发布节点
命令行实现控制圆周运动
- 先输入以下命令
rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twist "linear:
接下来按下Tab键
,会自动帮我们补全
- 接下来修改数据,把线速度的X修改为1,角速度的Z也修改为1.修改完后按下回车
- 这样就简单实现了小海龟的圆周运动,
三.C++编码实现小海龟圆周运动.
1.创建ROS工作空间
①创建工作空间
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
②编译工作空间
cd ~/catkin_ws
catkin_make
③编译工作空间
source devel/setup.bash
④检查环境变量
echo $ROS_PACKAGE_PATH
2.创建ROS功能包
①创建功能包
cd ~/catkin_ws/src
catkin_create_pkg learning_topic std_msgs rospy roscpp geometry_msgs
②编译功能包
cd ~/catkin_ws
catkin_make
source devel/setup.bash
3.C++代码
①.创建publisher.cpp文件
在位置~/catkin_ws/src/learning_topic/src/
下创建publisher.cpp文件.
②.发布话题的逻辑:
1.初始化ROS节点;
2.向ROS Master注册节点信息,包括发布的话题名和话题中的消息类型;
3.创建消息数据;
4.按照一定频率循环发布消息。
③.C++代码:
#include <sstream>
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "geometry_msgs/Twist.h"
int main(int argc, char **argv)
{
//初始化节点
ros::init(argc, argv, "publisher");
//创建节点句柄
ros::NodeHandle n;
//创建publisher,发布话题[/turtle1/cmd_vel],消息类型[geometry_msgs::Twist]
ros::Publisher chatter_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 1000);
//设置循环频率
ros::Rate loop_rate(100);
while (ros::ok())
{
//定义发布的数据
geometry_msgs::Twist msg;
//定义linear数据
geometry_msgs::Vector3 linear;
linear.x=1;
linear.y=0;
linear.z=0;
//定义angular数据
geometry_msgs::Vector3 angular;
angular.x=0;
angular.y=0;
angular.z=1;
msg.linear=linear;
msg.angular=angular;
//发布msg数据
chatter_pub.publish(msg);
//循环等待回调函数
ros::spinOnce();
//按照循环频率延时
loop_rate.sleep();
}
return 0;
}
4.添加编译选项
Python在ubuntu是可以直接执行的脚本语言,而C++是编译语言,在执行之前需要经过编译过程,因此在编译工作空间之前需要配置文件。
cd ~/catkin_ws/src/learning_topic
gedit CMakeLists.txt
- 在最后加上以下代码
add_executable(publisher src/publisher.cpp)
target_link_libraries(publisher ${catkin_LIBRARIES})
- 保存退出,再进行编译命令。
cd ~/catkin_ws
catkin_make
- 如果也显示100% 就接着下一步,启动publisher节点控制小海龟运动.
5.启动小海龟并实现控制
roscore
#打开新终端
rosrun turtlesim turtlesim_node
#打开新终端
cd ~/catkin_ws
#下面这一步是为了保证rosrun命令能够找到相应的功能包,有可以省去这一步骤的方法,各位可以自行查找
source ~/catkin_ws/devel/setup.bash
rosrun learning_topic publisher
- 完成命令后可以看到小海龟以圆周运动.
四.总结
这次实验是继用键盘控制小海龟移动后的进一步实验步骤,熟悉了ROS的消息和话题的收发机制.直观上也了解了小海龟的运动机制,了解了Turtlesim以线速度和角速度为基础运动,并且可以在终端直接进行赋值从而使得小海龟以我们想要的方式运动,并且最后我们实现了编程方式控制小海龟圆周运动,对ROS也有了更进一步的了解.
五.参考
[ROS基础-6] 发布话题消息控制Turtlesim运动实验
ROS通信实操(小乌龟通信实现)(九)C++、Python