第7章 ROS编程基础
本章主要介绍了ROS的基本编程实现内容,包括编程规则、发布者&订阅者、服务服务器&客户端、动作服务器&客户端。
同样的,由于本章节内容较多,博客学习记录分为三节。
本文主要介绍编程规则、发布者&订阅者两部分内容。


第7章 ROS编程基础

  • 7.1 编程基本规则
  • 7.2 发布者节点和订阅者节点的创建和运行


7.1 编程基本规则

1、标准单位SI

自学机器人编程Python 机器人编程 自学_计算机视觉

2、坐标系

机器人的旋转方向是右手定则,用右手卷住的方向是正(+)方向。

自学机器人编程Python 机器人编程 自学_可执行文件_02

3、命名规则

自学机器人编程Python 机器人编程 自学_回调函数_03


7.2 发布者节点和订阅者节点的创建和运行

《ROS机器人编程》

1. 创建功能包
依赖选项 message_generation、std_msgs、roscpp

$ cd ~/catkin_ws/src
$ catkin_create_pkg ros_tutorials_topic message_generation std_msgs roscpp

2. 修改功能包配置文件
package.xml是一个包含功能包信息的XML文件,包含用于描述功能包名称、作者、许可证和依赖包的信息。

$ gedit package.xml

3. 修改构建配置文件
ROS的构建系统catkin基本上使用CMake,在功能包目录中的CMakeLists.txt文件中描述了构建环境。该文件设置可执行文件的创建、依赖包优先构建、链接创建等。

$ gedit CMakeLists.txt

4. 创建消息文件
在构建时要包含消息MsgTutorial.msg,该消息将在此节点中被使用。

add_message_files(FILES MsgTutorial.msg)

创建MsgTutorial.msg:

$ roscd ros_tutorials_topic		→ 移动到功能包目录
$ mkdir msg						→ 功能包中创建新的msg消息目录
$ cd msg						→ 转到创建的msg目录
$ gedit MsgTutorial.msg			→ 创建新的MsgTutorial.msg文件并修改内容

5. 创建发布者节点和订阅者节点

CMakeLists.txt文件中,给了生成以下可执行文件的选项。
即,通过构建 .cpp 源文件来创建可执行文件。

add_executable(topic_publisher src/topic_publisher.cpp)
add_executable(topic_subscriber src/topic_subscriber.cpp)
$ roscd ros_tutorials_topic/src		→ 移至src目录,该目录是功能包的源代码目录
$ gedit topic_publisher.cpp			→ 新建源文件并修改内容

$ roscd ros_tutorials_topic/src		→ 移动到src目录,该目录是功能包的源代码目录 
$ gedit topic_subscriber.cpp		→ 创建和修改新的源代码文件

7. 构建(build)节点

catkin构建:

$ cd ~/catkin_ws&&catkin_make

功能包的源代码位于 “~/catkin_ws/src/ros_tutorials_topic/src"
消息文件位于 “~/catkin_ws/src/ros_tutorials_topic/msg”

“/build”目录中保存catkin构建用到的配置内容
“/devel/lib/ros_tutorials_topic’”目录中保存可执行文件。

8. 运行发布者和订阅者

运行的发布者节点,通过 rostopic 检查ros_tutorial_msg话题消息内容。

$ roscore
$ rosrun ros_tutorials_topictopic_publisher
$ rostopic echo /ros_tutorial_msg

自学机器人编程Python 机器人编程 自学_计算机视觉_04


运行订阅者节点,接收发布者发布的ros_tutorial_msg话题的消息,并在屏幕上显示该值。

$ rosrun ros_tutorials_topic topic_subscriber

9. 检查运行中的节点的通信状态

使用rqt_graph或rqt,查看运行中的节点的通信状态。

自学机器人编程Python 机器人编程 自学_可执行文件_05




古月居《ROS入门21讲》

古月居21讲中,对于发布者和订阅者的讲述构建的是小海龟运动实例。

1. 实现发布者节点的基本代码内容
(.cpp or .py,此处以.cpp为例)

自学机器人编程Python 机器人编程 自学_回调函数_06

  • 初始化ROS节点
// ROS节点初始化
ros::init(argc, argv, "velocity_publisher");
  • 向ROS Master注册节点信息,包括发布打话题名和话题中的消息类型
// 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);
  • 创建消息数据
// 初始化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();

自学机器人编程Python 机器人编程 自学_自学机器人编程Python_07



2. 实现订阅者节点的基本代码内容

自学机器人编程Python 机器人编程 自学_计算机视觉_08

  • 初始化ROS节点
// 初始化ROS节点
ros::init(argc, argv, "pose_subscriber");
  • 订阅需要的话题
// 创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback
ros::Subscriber pose_sub = n.subscribe("/turtle1/pose", 10, poseCallback);
  • 循环等待话题消息,接收到消息后进入回调函数
    (相当于一个中断,回调函数的处理时间不能太长)
// 循环等待回调函数,在回调函数中完成消息处理
ros::spin();

// 接收到订阅的消息后,会进入消息回调函数
void poseCallback(const turtlesim::Pose::ConstPtr& msg)
{
    // 将接收到的消息打印出来
    ROS_INFO("Turtle pose: x:%0.6f, y:%0.6f", msg->x, msg->y);
}

自学机器人编程Python 机器人编程 自学_可执行文件_09


此外,运行.py无需进行编译,但需要确认.py文件是可执行文件。

$ rosrun learning_topic pose_subscriber.py

自定义消息类型

自学机器人编程Python 机器人编程 自学_自学机器人编程Python_10

<build_depend> 编译依赖,message_generation动态产生功能包
<exec_depend> 执行依赖,message_runtime运行时的依赖项

find_package项是进行构建所需的组件包,让用户创建依赖包的选项。

add_message_files是添加消息文件的选项。
generate_messages是设置依赖的消息的选项。此示例是将DEPENDENCIES选项设置为使用std_msgs消息包。
catkin_package是catkin 构建选项:

  • INCLUDE_DIRS表示将使用INCLUDE_DIRS后面的内部目录include的头文件。
  • LIBRARIES表示将使用随后而来的功能包的库。
  • CATKIN_DEPENDS后面指定如roscpp或std_msgs等依赖包。
  • DEPENDS是一个描述系统依赖包的设置。