先运行乌龟程序
用如下命令查看例程节点关系图
$ rqt_graph
1.创建Publisher
Publisher主要作用是针对指定话题发布特定数据类型消息。接下来使用代码实现一个节点,节点中创建一个Publisher并发布字符串“Hello World”,源码learning_communication/src/talker.cpp如下
(源码的分析可以从其他博主空间里查找)
#include <sstream>
#include"ros/ros.h"
#include"std_msgs/String.h"
int main(int argc, char **argv)
{
ros::init(argc, argv, "Talker");
ros::NodeHandle n;
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter",1000);
ros::Rate loop_rate(10);
int count = 0;
while (ros::ok())
{
std_msgs::String msg;
std::stringstream ss;
ss<< "hello world"<< count;
msg.data = ss.str();
ROS_INFO("%s", msg.data.c_str());
chatter_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
++count;
}
return 0;
}
- 建立Subscriber
创建一个Subscriber以订阅Publisher节点发布的“Hello World”字符串,实现源码learning_communication/src/listener.cpp如下
(源码的分析可以从其他博主空间里查找)
#include "ros/ros.h"
#include "std_msgs/String.h"
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("I heard: [%s]", msg->data.c_str());
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "Listener");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
ros::spin();
return 0;
}
- 编译代码包
打开CMakelLists.txt文件去掉注释,进行如下配置
include_directories(
include
${catkin_INCLUDE_DIRS}
)
add_executable(Talker src/Talker.cpp)
target_link_libraries(Talker ${catkin_LIBRARIES} )
add_dependencies(Talker ${PROJECT_NAME}_generate_messages_cpp)
add_executable(Listener src/Listener.cpp)
target_link_libraries(Listener ${catkin_LIBRARIES} )
add_dependencies(Listener ${PROJECT_NAME}_generate_messages_cpp)
然后进行编译,编译会生成两个Talker、Listener,放在工作空间的~/catkin_ws/devel/lib/
修改完成后,进行编译
$ cd ~/catkin_ws
$ catkin_make
3.出现的问题
编译时会出现以下问题(笔者 出现的问题,但解决了)
出现这些问题时也找了一些办法但是都未解决,后来发现是同一工作空间目录下的文件夹中的文件有同名的“talker、listener”文件,因此去到learning_communication/src目录下,将talker与listener文件重命名,我就改成了“Talker、Listener”,但是也要记住要去,.cpp文件中把大小写改过来,同时CMakeLists.txt文件中也要改过来。
然后就行了。当然还可能遇到其他问题,这只是我遇到的问题解决方法。
- 运行Publisher与Subscriber
在运行前,先要进行环境变量的设置
$ cd ~/catkin_ws
$ source ./devel/setup.bash
环境变量设置成功后
先启动roscore
$ roscore
再启动Publisher
$ rosrun learning_communication Talker
然后启动Subscriber
$ rosrun learning_communication Listener
5.自定义话题服务消息
在learning_communication/msg目录下建立Person.msg文件
源码如下
string name
uint8 sex
uint8 age
uint8 unknown = 0
uint8 male = 1
uint8 female = 2
此时打开learning_communication的package.xml确保文件中设置了以下编译与运行依赖
(此处或许有两种运行依赖)我的如下:
<exec_depend>std_msgs</exec_depend>
<exec_depend>message_runtime</exec_depend>
很多的博文和教材里显示的第二句代码是
<run_depend>message_runtime</run_depend>
但是我运行时产生了报错,让我把exec代替了run 所以我的是这样。
完成添加后,再打开CMakelLists.txt文件,在find_package中添加消息生成依赖功能包message——generation。
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
catkin依赖设置如下:
catkin_package(
INCLUDE_DIRS include
LIBRARIES learning_communication
CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
DEPENDS system_lib
)
最后设置编译的.msg文件
add_service_files(
FILES
AddTwoInts.srv
)
generate_messages(
DEPENDENCIES
std_msgs
)
完成以上配置后,回到工作空间路径下用catkin_make进行编译,再用如下命令看Person消息
$ rosmsg show Person