ROS 快速入门教程03
8.编写Subscriber订阅者节点
8.1 创建订阅者节点
cd catkin_ws/src/
catkin_create_pkg atr_pkg rospy roscpp std_msgs
ros::Subscriber sub = nh.subscribe(话题名, 缓存队列长度, 回调函数)
回调函数通常在你创建订阅者时定义。一个订阅者会监听一个话题,并在有消息到达时调用回调函数,而不用手动去执行函数。
#include<ros/ros.h>
#include<std_msgs/String.h>
void chao_callback( std_msgs::String msg)
{printf(msg.data.c_str());printf("\n");
}
int main(int argc, char **argv)
{ros::init(argc, argv, "ma_node");ros::NodeHandle nh;ros::Subscriber sub = nh.subscribe("ssr_node_topic", 10,chao_callback);while(ros::ok()){ros::spinOnce();//功能:处理回调函数}return 0;
}
打开CMakeList,添加后编译。
add_executable(ma_node src/atr_pkg_node.cpp)
target_link_libraries(ma_node${catkin_LIBRARIES})
打开三个终端分别输入
roscore
rosrun ssr_pkg chao_node
rosrun atr_pkg ma_node
显示接收时间函数
#include<ros/ros.h>
#include<std_msgs/String.h>void chao_callback( std_msgs::String msg)
{ROS_INFO(msg.data.c_str());
}int main(int argc, char **argv)
{setlocale(LC_ALL,"");//设置中文显示ros::init(argc, argv, "ma_node");ros::NodeHandle nh;ros::Subscriber sub = nh.subscribe("ssr_node_topic", 10,chao_callback);while(ros::ok()){ros::spinOnce();//功能:处理回调函数}return 0;
}
再次运行ma_node节点。
8.2 多个订阅者和发布者图形化显示
当存在多个订阅者和发布者时,可以使用rqt_graph
来显示逻辑关系。
8.3 小结
9.launch启动多个ROS节点
上一小节中,我们启动多个节点就需要打开多个终端,这非常繁琐。这一小节中我们使用launch来启动多个节点。
luanch文件遵循XML语法
<标记名称 属性名1= "属性值1"...>内容</标记名称>
打开vscode,在工作目录的任意子文件夹下创建launch文件
<launch>
<node pkg ="ssr_pkg" type="yao_node" name="yao_node"/>
<node pkg ="ssr_pkg" type="chao_node" name="chao_node"/>
<node pkg ="atr_pkg" type="ma_node" name="ma_node" output="screen"/>
</launch>
打开终端输入
roslaunch atr_pkg kaihei.launch
9.2 小结
10.ROS机器人运动控制
机器人的运动可以分解为矢量运动和旋转运动。
矢量运动:二维平面中的各种平移。单位:米/每秒。
旋转运动:机器人进行转向。单位:弧度/每秒。
11.机器人运动控制的实现
第一节中我们已经下载过wpr_simulation
这个源代码了。
cd catkin_ws
catkin_make #编译源代码文件
roslaunch wpr_simulation #开启演示模拟环境
#再打开一个终端输入
rosrun wpr_simulation demo_vel_ctrl#进行demo演示
本节课就要实现这样的一个效果,实现思路:
cd catkin_ws/src/
catkin_create_pkg vel_pkg roscpp rospy geometry_msgs
打开vscode,在vel_pkg
文件夹下的src
目录里创建叫vel_node.cpp
文件。
#include<ros/ros.h>
#include<geometry_msgs/Twist.h>int main(int argc,char **argv)
{ros::init(argc,argv,"vel_node");ros::NodeHandle n;ros::Publisher vel_pub = n.advertise<geometry_msgs::Twist>("cmd_vel",10);geometry_msgs::Twist vel_msg;vel_msg.linear.x = 0.1;vel_msg.linear.y = 0.0;vel_msg.linear.z = 0.0; vel_msg.angular.x = 0.0;vel_msg.angular.y = 0.0;vel_msg.angular.z = 0.0;ros::Rate r(30);while(ros::ok()){vel_pub.publish(vel_msg);r.sleep();}return 0;
}
cmake里添加后编译。
add_executable(vel_node src/vel_node.cpp)
add_dependencies(vel_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(vel_node${catkin_LIBRARIES}
)
分别在两个终端里输入:
roslaunch wpr_simulation wpb_simple.launch
rosrun vel_pkg vel_node
便能看到小车在缓慢向前移动。