ROS入门21讲(2)
作者:互联网
四、创建工作空间与功能包
1、工作空间
工作空间(workspace):是一个存放工程开发相关文件的文件夹(相当于在IDE中创建的工程文件)。
包含:
src:代码空间(Source Space),放置功能包的源码
build:编译空间(Build Space),编译过程中生成的一些中间文件,一般用不到
devel:开发空间(Development Space),放置开发中生成的可执行文件以及一些库
install:安装空间(Install Space),放置最终生成(开发后)的可执行文件
1.1创建工作空间
(1)创建工作空间:
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace
注意:mkdir -p是递归创建目录;初始化之后会显示一个CMakeLists.txt的文件。
(2)编译工作空间
$ cd ~/catkin_ws/
$ catkin_make
注意:此时会产生build、devel以及我们自己创建的src文件,还缺少install的文件
$ catkin_make install
(3)设置环境变量
$ source devel/setup.bash
注意:设置环境变量的原因是为了让系统找到我们的工作空间,并且找到对应的功能包。
(4)检查环境变量
$echo $ROS_PACKAGE_PATH
图示:
1.2创建功能包
命令: $ catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
(1)创建功能包
$ cd ~/catkin_ws/src
$ catkin_create_pkg test_pkg std_msgs rospy roscpp
说明:创建一个测试包,std_msgs是一个标准库,rospy是py依赖包,roscpp是C++依赖包。
(2)编译功能包
$ cd ~/catkin_ws
$ catkin_make
注意:同一个工作空间下,不允许存在同名功能包;不同工作空间下,允许存在同名功能包。
test_pkg测试包包含下面四个文件:
include:头文件
src:源码存放处
CMakeLists.txt:描述功能包里面的编译规则,CMake是个编译器
package.xml:用xml语言描述的功能包的相关信息。
五、发布者Publisher的编程实现
1、话题模型
2、创建功能包
命令:
$ cd ~/catkin_ws/src
$ catkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim
3、创建发布者代码
如何实现一个发布者?
① 初始化ROS节点;
② 向ROS Master 注册节点信息,包括发布的话题名和话题中的消息类型;
③创建消息数据;
④按照一定频率循环发布消息
C++代码如下:
1 /** 2 * 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist 3 */ 4 5 #include <ros/ros.h> 6 #include <geometry_msgs/Twist.h> 7 8 int main(int argc, char **argv) 9 { 10 // ROS节点初始化 11 ros::init(argc, argv, "velocity_publisher"); 12 13 // 创建节点句柄 14 ros::NodeHandle n; 15 16 // 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10 17 ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10); 18 19 // 设置循环的频率 20 ros::Rate loop_rate(10); 21 22 int count = 0; 23 while (ros::ok()) 24 { 25 // 初始化geometry_msgs::Twist类型的消息 26 geometry_msgs::Twist vel_msg; 27 vel_msg.linear.x = 0.5; 28 vel_msg.angular.z = 0.2; 29 30 // 发布消息 31 turtle_vel_pub.publish(vel_msg); 32 ROS_INFO("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]", 33 vel_msg.linear.x, vel_msg.angular.z); 34 35 // 按照循环频率延时 36 loop_rate.sleep(); 37 } 38 39 return 0; 40 }View Code
python代码如下:
#!/usr/bin/env python # -*- coding: utf-8 -*- ######################################################################## #### Copyright 2020 GuYueHome (www.guyuehome.com). ### ######################################################################## # 该例程将发布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: passView Code
注意:在python文件中一定要注意它的权限,在属性里面找权限
4、配置发布者代码编译规则
如何配置CMakeLists.txt中的编译规则?
①设置需要编译的代码和生成的可执行文件;
②设置链接库;
在 CMakeLists.txt的文件添加以下代码:
add_executable(velocity_publisher src/velocity_publisher.cpp) target_link_libraries(velocity_publisher ${catkin_LIBRARIES})
注意:add_executable是为了描述把哪一个程序编译成可执行文件的;add_executable(A B.cpp)是把B.cpp编译成A这个可执行文件的
target_link_libraries是将可执行文件与ROS的一些库做链接的
注意:
①配置环境变量步骤:
回到主文件夹,Ctrl+H将隐藏的.bashrc文件打开,在最后一行将工作空间的环境变量设置进去(注意路径)
source /home/gy/catkin_ws/devel/setup.bash
这样输入完就不用每次在终端里输入source命令了,但需要重新启动终端才生效
②编译后的路径在devel/liblearning_topic
5、编译并运行发布者
命令:
$ cd ~/catkin_ws
$ catkin_make
$ source devle/setup.bash
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun learning_topic velocity_publisher
六、订阅者Subscriber 的编程实现
1、话题模型
如何实现一个订阅者?
① 初始化ROS节点
② 订阅需要的话题
③ 循环等待话题消息,接收到消息后进入回调函数
④ 在回调函数中完成消息处理
2、创建订阅者代码
C++代码如下:
1 /** 2 * 该例程将订阅/turtle1/pose话题,消息类型turtlesim::Pose 3 */ 4 5 #include <ros/ros.h> 6 #include "turtlesim/Pose.h" 7 8 // 接收到订阅的消息后,会进入消息回调函数 9 void poseCallback(const turtlesim::Pose::ConstPtr& msg) 10 { 11 // 将接收到的消息打印出来 12 ROS_INFO("Turtle pose: x:%0.6f, y:%0.6f", msg->x, msg->y); 13 } 14 15 int main(int argc, char **argv) 16 { 17 // 初始化ROS节点 18 ros::init(argc, argv, "pose_subscriber"); 19 20 // 创建节点句柄 21 ros::NodeHandle n; 22 23 // 创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback 24 ros::Subscriber pose_sub = n.subscribe("/turtle1/pose", 10, poseCallback); 25 26 // 循环等待回调函数 27 ros::spin(); 28 29 return 0; 30 }View Code
python代码如下:
#!/usr/bin/env python # -*- coding: utf-8 -*- ######################################################################## #### Copyright 2020 GuYueHome (www.guyuehome.com). ### ######################################################################## # 该例程将订阅/turtle1/pose话题,消息类型turtlesim::Pose import rospy from turtlesim.msg import Pose def poseCallback(msg): rospy.loginfo("Turtle pose: x:%0.6f, y:%0.6f", msg.x, msg.y) def pose_subscriber(): # ROS节点初始化 rospy.init_node('pose_subscriber', anonymous=True) # 创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback rospy.Subscriber("/turtle1/pose", Pose, poseCallback) # 循环等待回调函数 rospy.spin() if __name__ == '__main__': pose_subscriber()View Code
3、配置订阅者代码编译规则
如何配置CMakeLists.txt中的编译规则?
①设置需要编译的代码和生成的可执行文件;
②设置链接库;
在 CMakeLists.txt的文件添加以下代码:
add_executable(velocity_subscriber src/velocity_subscriber.cpp) target_link_libraries(velocity_subscriber ${catkin_LIBRARIES})
4、编译并运行订阅者
命令:
$ cd ~/catkin_ws
$ catkin_make
$ source devle/setup.bash
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun learning_topic velocity_publisher
标签:catkin,21,pose,rospy,msg,velocity,vel,ROS,入门 来源: https://www.cnblogs.com/Gaowaly/p/16671175.html