ROS是机器人操作系统的简称,本文介绍我的第一个ROS应用开发,发布者Publisher的编程。程序很简单,代码就几行,但是让仿真小乌龟运动起来。先是c++代码,然后是python 代码,你也可选择只看一种你熟悉的。
在 ROS 开发应用准备:创建工作空间 一文中建立了ROS工作空间,现在就建立一个功能包:
cd ~/catkin_ws/src
catkin_create_pkg learning_topic std_msgs roscpp rospy geometry_msgs turtlesim
第1行是回到工作空间的src 目录,功能包建立必须在这个目录下运行。
第2行是建立功能包的命令,第一个参数是功能包的名字,这里是learning_topic , 接下来是功能包的依赖库,这里是std_msgs roscpp rospy geometry_msgs turtlesim 共5个依赖库。
上面命令执行后,可以在src 目录下看到有一个目录,名字是learning_topic,其下有下面内容:
CMakeLists.txt include package.xml scripts src
其中scripts 是后来手工建立的,用于存放 python代码。
在src 目录下,也是~/catkin_ws/src/learning_topic/src 目录, 建立一个文件 velocity_publisher.cpp,
cd ~/catkin_ws/src/learning_topic/src
nano velocity_publisher.cpp
内容为:
/**
* 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist
*/
#include
#include
int main(int argc, char **argv)
{
// ROS节点初始化
ros::init(argc, argv, "velocity_publisher");
// 创建节点句柄
ros::NodeHandle n;
// 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
ros::Publisher turtle_vel_pub = n.advertise("/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.linear.x = 0.5;
vel_msg.angular.z = 0.2;
// 发布消息
turtle_vel_pub.publish(vel_msg);
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;
}
这个代码有清晰的注释,这是一个实现发布者的基本流程:
初始化ROS节点
创建节点句柄
创建一个发布者,包含话题名,消息类型
设置循环频率
循环
在 ~/catkin_ws/src/learning_topic/ 目录下,有个CMakeLists.txt 文件,我们需要修改这个文件
cd ~/catkin_ws/src/learning_topic/
nano CMakeLists.txt
在这个文件中添加下面2行,
add_executable(velocity_publisher src/velocity_publisher.cpp)
target_link_libraries(velocity_publisher ${catkin_LIBRARIES})
添加的位置是参考下面位置,就是 ## install ## 前面:
# target_link_libraries(${PROJECT_NAME}_node
# ${catkin_LIBRARIES}
# )
add_executable(velocity_publisher src/velocity_publisher.cpp)
target_link_libraries(velocity_publisher ${catkin_LIBRARIES})
#############
## Install ##
#############
保存,退出
这样编译配置就完成了。
编译必须回到 ~/catkin_ws 目录下
cd ~/catkin_ws
catkin_make
编译后应该source 一次:
source devel/setup.bash
如果编译有错,就要排除错误,然后就运行测试。
打开一个终端,启动ros,执行
roscore
再打开一个终端,运行小乌龟
rosrun turtlesim turtlesim_node
上面是启动测试环境,如果有问题,可以 参看: ROS 下的仿真小乌龟,只是不启动键盘控制。
最后在我们的终端执行:
rosrun learning_topic velocity_publisher
我打开文件管理器,下面位置有个velocity_publisher
执行上面命令后,我们看到小乌龟在转圆圈。
c++的开发就到此完成了。
为了不和c++混在一起,在~/catkin_ws/src/learning_topic/目录下新建一个scripts目录,然后到这个目录下,新建一个velocity_publisher.py 文件
cd ~/catkin_ws/src/learning_topic/scripts
nano velocity_publisher.py
文件内容是:
#!/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.5
vel_msg.angular.z = 0.2
# 发布消息
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
代码里有清晰说明,流程是:
ROS节点初始化
创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
设置循环的频率
循环
更改velocity_publisher.py 有执行属性
chmod +x *.py
这个可以用 ls -l 查核:
leon@ubuntu:~/catkin_ws/src/learning_topic/scripts$ ls -l
total 8
-rwxrwxrwx 1 leon leon 824 May 8 2020 pose_subscriber.py
-rwxrwxrwx 1 leon leon 1275 May 8 2020 velocity_publisher.py
leon@ubuntu:~/catkin_ws/src/learning_topic/scripts$
python 不用编译,
但是要打开一个终端,启动roscore ,再打开一个终端 启动小乌龟rosrun turtlesim turtlesim_node
还有记得source ~/catkin_ws/devel/setup.bash
最后直接执行就可以,
rosrun learning_topic velocity_publisher.py
执行的结果是小乌龟转圆圈,和c++ 执行一样,可以参看上面c++的示图。
再打开一个新的终端,并输入命令:
rqt_graph
可以看到如下信息关系图:
信息前部分是话题/turtle/cmd_vel 就是发布者Publisher和仿真乌龟间的信息流。
这2个源代码也可以在 https://github.com/huchunxu/ros_21_tutorials 下载
介绍到此。