[ROS]一、ROS的基本概念
[ROS]二、命令与工具的使用
[ROS]三、建立工作空间
前言
在之前的教程中,我们是通过命令行的形式和键盘的控制形式使得海龟动起来,现在通过程序的方式实现海龟动起来
提示:以下是本篇文章正文内容,下面案例可供参考
一、话题发布/订阅模型
这个模型中主要有两个节点(node)一个是速度发布节点Publisher(Turtle Velovity),一个是订阅节点Subscriber(turtlesim)即海龟仿真器,今天要通过程序实现的就是速度发布节点Publisher(Turtle Velovity),来发布Message,这个Message的结构是geometry_msgs::Twist,里面分为角速度和线速度,再通过话题Topic(/turtle1/cmd_vel)这个管道把数据传送给Subscriber(turtlesim),Subscriber(turtlesim)就可以订阅这些数据来控制海龟
二、实现的步骤
1.创建功能包(上一章节有讲)
打开终端输入下面的命令cd ~/catkin_ws_me/src
catkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim #learning_topic功能包的名称,后面就是依赖
2.实现发布者的流程
- 初始化ROS节点
- 向ROS Master注册节点消息,包括发布的话题名和话题中的消息类型
- 创建消息数据
- 按照一定频率循环发布消息
首先切换到learning_topic/src目录下
cd ~/catkin_ws_me/src/learning_topic/src
创建名为velocity_publisher.cpp的文件,将如下的代码粘贴进去,这个是采用c++来实现的
/**
* 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist
*/
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
int main(int argc, char **argv)
{
// 用ros::init完成ROS节点初始化,(argc, argv是两个参数,默认就可以了,不需要配置)velocity_publisher为节点名,注意节点名称是不可以重复的
ros::init(argc, argv, "velocity_publisher");
// 创建节点句柄,管理ros的API接口
ros::NodeHandle n;
// 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);
// 设置循环的频率
ros::Rate loop_rate(10);
int count = 0;
while (ros::ok())
{
// 初始化geometry_msgs::Twist类型的消息
geometry_msgs::Twist vel_msg;//创建对象vel_msg
vel_msg.linear.x = 0.5;
vel_msg.angular.z = 0.2;
// 发布消息。利用publish方法发布vel_msg数据内容
turtle_vel_pub.publish(vel_msg);
//类似print使得相关信息显示
ROS_INFO("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]",
vel_msg.linear.x, vel_msg.angular.z);
// 按照循环频率延时
loop_rate.sleep();
}
return 0;
}
3.配置发布者代码编译规则
这个时候就需要编辑CMakelists.txt文件,目的是为了
- 设置需要编译的代码和生成的可执行文件;
- 设置连接库
打开如图选中的文件
然后将下面这两句话放到这个位置
add_executable(velocity_publisher src/velocity_publisher.cpp)这句话的意思是将src/velocity_publisher.cpp这个文件编译生成velocity_publisher可执行文件;target_link_libraries的功能是将velocity_publisher可执行文件跟ros的一些库做连接,eg.C++或则python的一些接口。
add_executable(velocity_publisher src/velocity_publisher.cpp)
target_link_libraries(velocity_publisher ${catkin_LIBRARIES})
然后回到工作空间的根目录下来做编译。
cd ~/catkin_ws_me
catkin_make
source devel/setup.bash #添加换进变量。
roscore #第一个终端运行
rosrun turtlesim turtlesim_node #第二个终端运行
rosrun learning_topic velocity_publisher #第三个终端运行
执行上面的命令将会出现如下图的结果
4.实现同一功能的python版程序
在learning_topic文件创建文件夹scripts来存放python文件,如图
注意:python文件一定要赋予它可执行文件,右键选择属性,点击权限,将允许做为可执行文件这个选项打勾
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist
import rospy
from geometry_msgs.msg import Twist
def velocity_publisher():
# ROS节点初始化
rospy.init_node('velocity_publisher', anonymous=True)
# 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
turtle_vel_pub = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10)
#设置循环的频率
rate = rospy.Rate(10)
while not rospy.is_shutdown():
# 初始化geometry_msgs::Twist类型的消息
vel_msg = Twist()
vel_msg.linear.x = 0.9
vel_msg.angular.z = 0.9
# 发布消息
turtle_vel_pub.publish(vel_msg)
rospy.loginfo("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]",
vel_msg.linear.x, vel_msg.angular.z)
# 按照循环频率延时
rate.sleep()
if __name__ == '__main__':
try:
velocity_publisher()
except rospy.ROSInterruptException:
pass
总结
好了今天就学到这里了,不要放弃前进的脚步。