做系统网站建设,SEO案例网站建设公司,中国建设教育协会网站打不开,东莞php网站建设文章目录0、引言1、创建发布者#xff08;velocity发布者 →geometry话题消息→turtlesim订阅者#xff09;2、创建订阅者#xff08;turtlesim发布者→turtlesim话题消息→pose订阅者#xff09;3、自定义话题消息4、使用自定义话题消息#xff08;person发布者→自定义话…
文章目录0、引言1、创建发布者velocity发布者 →geometry话题消息→turtlesim订阅者2、创建订阅者turtlesim发布者→turtlesim话题消息→pose订阅者3、自定义话题消息4、使用自定义话题消息person发布者→自定义话题消息→person订阅者0、引言 font笔者因研究课题涉及ROS开发学习了古月居出品的ROS入门21讲为巩固话题通信用于不断更新、少逻辑处理的数据处理场景知识本文将ROS的发布者、订阅者和话题消息三讲内容进行总结。
1、创建发布者velocity发布者 →geometry话题消息→turtlesim订阅者 1创建功能包
cd ~/catkin_ws/srccatkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim2创建发布者cpp文件 在新建的功能包下src中打开新终端并键入gedit velocity_publisher.cpp输入以下代码并保存。
/*** 该例程将发布turtle1/cmd_vel话题消息类型geometry_msgs::Twist*/
#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发布名为/turtle1/cmd_vel的topic消息类型为geometry_msgs::Twist队列长度10ros::Publisher turtle_vel_pub n.advertisegeometry_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在CMakeLists.txt添加编译规则;
add_executable(velocity_publisher src/velocity_publisher.cpp)
target_link_libraries(velocity_publisher ${catkin_LIBRARIES})4编译并运行发布者。 ①编译并启动roscore
cd ~/catkin_wscatkin_make
或
catkin_make_isolatedsource devel/setup.bash
或
source devel_isolated/setup.bashroscore②新建终端运行海龟结点
rosrun turtlesim turtlesim_node③新建终端运行发布者
//每新打开一个终端需要重新定义源
source devel/setup.bash
或
source devel_isolated/setup.bashrosrun learning_topic velocity_publisher2、创建订阅者turtlesim发布者→turtlesim话题消息→pose订阅者 1在发布者功能包下创建订阅者cpp文件 在新建的功能包下src中终端键入gedit pose_subscriber.cpp输入以下代码并保存。
/***********************************************************************
Copyright 2020 GuYueHome (www.guyuehome.com).
***********************************************************************//*** 该例程将订阅/turtle1/pose话题消息类型turtlesim::Pose*/#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注册回调函数poseCallbackros::Subscriber pose_sub n.subscribe(/turtle1/pose, 10, poseCallback);// 循环等待回调函数ros::spin();return 0;
}2在CMakeLists.txt添加编译规则
add_executable(pose_subscriber src/pose_subscriber.cpp)
target_link_libraries(pose_subscriber ${catkin_LIBRARIES})3编译并运行订阅者。 ①编译并启动roscore
cd ~/catkin_wscatkin_make
或
catkin_make_isolatedsource devel/setup.bash
或
source devel_isolated/setup.bashroscore②新建终端运行海龟结点
rosrun turtlesim turtlesim_node启动发布者后海龟将进行匀速圆周运动。 ③新建终端运行订阅者
//每新打开一个终端需要重新定义源
source devel/setup.bash
或
source devel_isolated/setup.bashrosrun learning_topic pose_subscriber④新建终端运行海龟键盘动态结点。
rosrun turtlesim turtle_teleop_key在该终端下可通过键盘方向键手动控制海龟移动。
3、自定义话题消息 1创建.msg文件 在~/catkin_ws/src/learning_topic目录下新建msg目录并进入该目录在该目录下打开终端键入gedit Person.msg输入以下内容并保存。
string name
uint8 sex
uint8 age
string x
string yuint8 unkonwn 0
uint8 male 1
uint8 female 22在package.xml中添加功能包依赖
build_dependmessage_generation/build_depend
exec_dependmessage_runtime/exec_depend3在CMakeLists.txt添加编译规则。
//在find_package下添加message_generation//在合适位置添加以下内容
add_message_files(FILES Person.msg)
generate_messages(DEPENDENCIES std_msgs)//在catkin_package添加message_runtime4、使用自定义话题消息person发布者→自定义话题消息→person订阅者 1创建测试消息的发布者 在~/catkin_ws/src/learning_topic/src目录下打开终端键入gedit person_publisher.cpp输入以下代码并保存。
/***********************************************************************
Copyright 2020 GuYueHome (www.guyuehome.com).
***********************************************************************//*** 该例程将发布/person_info话题自定义消息类型learning_topic::Person*/#include ros/ros.h
#include learning_topic/Person.hint main(int argc, char **argv)
{// ROS节点初始化ros::init(argc, argv, person_publisher);// 创建节点句柄ros::NodeHandle n;// 创建一个Publisher发布名为/person_info的topic消息类型为learning_topic::Person队列长度10ros::Publisher person_info_pub n.advertiselearning_topic::Person(/person_info, 10);// 设置循环的频率ros::Rate loop_rate(1);int count 0;while (ros::ok()){// 初始化learning_topic::Person类型的消息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;
}2创建测试消息的订阅者 在~/catkin_ws/src/learning_topic/src目录下打开终端键入gedit person_subscriber.cpp输入以下代码并保存。
/***********************************************************************
Copyright 2020 GuYueHome (www.guyuehome.com).
***********************************************************************//*** 该例程将订阅/person_info话题自定义消息类型learning_topic::Person*/#include ros/ros.h
#include learning_topic/Person.h// 接收到订阅的消息后会进入消息回调函数
void personInfoCallback(const learning_topic::Person::ConstPtr msg)
{// 将接收到的消息打印出来ROS_INFO(Subcribe Person Info: name:%s age:%d sex:%d, msg-name.c_str(), msg-age, msg-sex);
}int main(int argc, char **argv)
{// 初始化ROS节点ros::init(argc, argv, person_subscriber);// 创建节点句柄ros::NodeHandle n;// 创建一个Subscriber订阅名为/person_info的topic注册回调函数personInfoCallbackros::Subscriber person_info_sub n.subscribe(/person_info, 10, personInfoCallback);// 循环等待回调函数ros::spin();return 0;
}3在CMakeLists.txt添加编译规则
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 ${catkin_LIBRARIES})
add_dependencies(person_subscriber ${PROJECT_NAME}_generate_messages_cpp)4编译运行。
cd ~/catkin_wscatkin_make
或
catkin_make_isolatedsource devel/setup.bash
或
source devel_isolated/setup.bashroscore//新建终端然后再执行以下代码
cd ~/catkin_ws
source devel/setup.bash
或
source devel_isolated/setup.bash
rosrun learning_topic person_publisher//新建终端然后再执行以下代码
cd ~/catkin_ws
source devel/setup.bash
或
source devel_isolated/setup.bash
rosrun learning_topic person_subscriber参考资料 [1] 古月居GYH. 【古月居】古月·ROS入门21讲 | 一学就会的ROS机器人入门教程; 2019-07-16 [accessed 2023-04-09]. [2] ~Old. ROS——话题通信; 2022-03-18 [accessed 2023-04-09]. [3] Maccy37. OS查询话题具体内容常用指令; 2020-09-04 [accessed 2023-04-10]. [4] 李徕徕. ROS(4)--------------------ros::Rate loop_rate( ) loop_rate.sleep()ros_spin()ros_spinOnce(); 2020-07-29 [accessed 2023-04-10]. [5] 小萌虫. ROS21讲; 2021-08-13 [accessed 2023-04-10].