文章目录
第9课 创建工作空间与功能包
1、工作空间结构
工作空间是存放工程的相关文件的文件夹。通常结构如下:
- src:代码空间(放代码与功能包的文件夹)
- build:编译空间
- devel:开发空间(source此文件夹)
- install:安装空间
2、创建工作空间
#创建工作空间
mkdir-p~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
#编译工作空间
cd ~/catkin_ws/
catkin_make
#设置工作变量
source devel/setup.bash
#检查环境变量
echo $ROS_PACKAGE_PATH
3、创建功能包
语法:catkin_create_pkg <package_name>[depend1][depend2][depend3]
#创建功能包
$ cd ~/catkin_ws/src
$ catkin_create_pkg test_pkg std_msgs rospy roscpp
#编译功能包
$ cd ~/catkin_ws
$ catkin_make
$ source ~/catkin_ws/devel/setup.bash
第10课 发布者publisher的编程与实现
1、话题模型
2、创建发布者节点
$ cd ~/catkin_ws/src
$ catkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim
- 初始化
- 向ROS Master注册节点信息,包括:话题、消息
- 实例化消息并循环发出
#include<ros/ros.h>
#include<geometry_msgs/Twist.h>
int main(int argc,char **argv)
{
//ROS初始化
ros::init(argc,argv,"velocity_publisher");
//创建节点句柄
ros::NodeHandle n;
//创建一个publisher,向ROS Master注册
ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("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("Publish turtle velocity command[%0.2f m/s %0.2f rad/s]",
vel_msg.linear.x,vel_msg.angular.z);
loop_rate.sleep();
}
return 0;
}
3、编译功能包
设置需要编译的代码和生成的可执行文件
设置链接库
add_executable(velocity_publisher src/velocity_publisher.cpp)
target_link_libraries(velocity_publisher $[catkin_LIBRARIES])
4、运行节点
$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun learning_topic velocity_publisher
第11课 订阅者Subscriber的编程与实现
1、创建订阅节点
- 初始化ROS节点
- 订阅需要的话题
- 循环等待消息进入回调函数
- 回调函数消息处理
#include <ros/ros.h>
#include "turtlesim/Pose.h"
// 接收到订阅的消息后,会进入消息回调函数
void poseCallback(const turtlesim::Pose::ConstPtr& msg)
{
// 将接收到的消息打印出来
ROS_INFO("Turtle pose: x:%0.6f, y:%0.6f", msg->x, msg->y);
}
int main(int argc, char **argv)
{
// 初始化ROS节点
ros::init(argc, argv, "pose_subscriber");
// 创建节点句柄
ros::NodeHandle n;
// 创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback
ros::Subscriber pose_sub = n.subscribe("/turtle1/pose", 10, poseCallback);
// 循环等待回调函数
ros::spin();
return 0;
}
2、编译订阅节点
设置需要编译的代码和生成的可执行文件
设置链接库
add_executable(pose_subscriber src/pose_subscriber.cpp)
target_link_libraries(pose_subscriber $[catkin_LIBRARIES])
3、运行节点
$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun learning_topic velocity_publisher
$ rosrun learning_topic pose_subscriber
第12课 话题消息的定义与使用
1、话题模型
2、自定义话题消息
- 在功能包中创建msg文件
- 创建.msg文件
- package.xml添加功能包依赖
- CMakeList.txt
string name
uint8 sex
uint8 age
uint8 unknown=0
uint8 male =1
uint8 female =2
报错信息:
CMake Error at /opt/ros/noetic/share/catkin/cmake/catkin_package.cmake:108 (message):
catkin_package() called with unused arguments: message_runtime
原因,修改为:
catkin_package( CATKIN_DEPENDS roscpp rospy std_msgs message_runtime)
编译生成的头文件,位置:
catkin_ws/devel/include/learning_topic/Person.h
3、创建发布者节点
- 初始化
- 向ROS master发送注册信息
- 创建消息数据
- 按照一定频率循环发送
#include<ros/ros.h>
#include"learning_topic/Person.h"
int main(int argc,char **argv)
{
//初始化
ros::init(argc,argv,"person_publisher");
//创建句柄
ros::NodeHandle n;
//创建publisher
ros::Publisher person_info_pub =n.advertise<learning_topic::Person>("/person_info",10);
//设置循环频率
ros::Rate loop_rate(1);
int count =0 ;
while(ros::ok())
{
learning_topic::Person person_msg;
person_msg.name="Tom";
person_msg.age=18;
person_msg.sex=learning_topic::Person::male;
person_info_pub.publish(person_msg);
ROS_INFO("Publish Person Info:name %s age %d sex %d ",
person_msg.name.c_str(),person_msg.age,person_msg.sex);
loop_rate.sleep();
}
return 0;
}
4、创建订阅者节点
- 初始化节点
- 向ROS MASTER发送注册消息
- 循环等待进入回调函数
- 回调函数处理数据
#include<ros/ros.h>
#include"learning_topic/Person.h"
void personInfoCallback(const learning_topic::Person::ConstPtr& msg)
{
ROS_INFO("Subscribe Person Info: name:%s age:%d sex:%d",
msg->name.c_str(),msg->age,msg->sex);
}
int main(int argc,char **argv)
{
//初始化
ros::init(argc,argv,"person_subscriber");
//创建句柄
ros::NodeHandle n;
//创建订阅者
ros::Subscriber person_info_sub= n.subscribe("/person_info",10,personInfoCallback);
//等待回调函数
ros::spin();
return 0;
}
5、编译功能包
- 设置需要编译的代码和生成的可执行文件
- 设置链接库
- 添加依赖项
add_executable(person_publisher src/person_publisher.cpp)
target_link_libraries(person_publisher $[catkin_LIBRARIES])
add_dependencies(person_publisher ${PROJECT_NAME}_generate_messages_cpp)
add_executable(person_subscriber src/person_subscriber.cpp)
target_link_libraries(person_subscriber $fcatkin_LIBRARIES])
add_dependencies(person_subscriber $[PROJECT_NAME]_generate_messages_cpp)
6、节点运行
$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash
$ roscore
$ rosrun learning_topic person_subscriber
$ rosrun learning_topic person_publisher