第7章 ROS编程基础
本章主要介绍了ROS的基本编程实现内容,包括编程规则、发布者&订阅者、服务服务器&客户端、动作服务器&客户端。
同样的,由于本章节内容较多,博客学习记录分为三节。
本文主要介绍编程规则、发布者&订阅者两部分内容。
《ROS机器人编程》源代码:
https://github.com/ROBOTIS-GIT/ros_tutorials/tree/master/ros_tutorials_topic
古月居源代码:
https://github.com/huchunxu/ros_21_tutorials/tree/master/learning_topic
2、坐标系
机器人的旋转方向是右手定则,用右手卷住的方向是正(+)方向。
3、命名规则
《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
运行订阅者节点,接收发布者发布的ros_tutorial_msg话题的消息,并在屏幕上显示该值。
$ rosrun ros_tutorials_topic topic_subscriber
9. 检查运行中的节点的通信状态
使用rqt_graph或rqt,查看运行中的节点的通信状态。
古月居《ROS入门21讲》
古月居21讲中,对于发布者和订阅者的讲述构建的是小海龟运动实例。
1. 实现发布者节点的基本代码内容
(.cpp or .py,此处以.cpp为例)
// ROS节点初始化
ros::init(argc, argv, "velocity_publisher");
// 创建一个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();
2. 实现订阅者节点的基本代码内容
// 初始化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);
}
此外,运行.py无需进行编译,但需要确认.py文件是可执行文件。
$ rosrun learning_topic pose_subscriber.py
自定义消息类型
find_package项是进行构建所需的组件包,让用户创建依赖包的选项。
add_message_files是添加消息文件的选项。
generate_messages是设置依赖的消息的选项。此示例是将DEPENDENCIES选项设置为使用std_msgs消息包。
catkin_package是catkin 构建选项: