1 创建包
catkin_creat_pkg beginner_tutorials std_msgs rospy roscpp
2 创建话题和服务
# 消息
roscd beginner_tutorials
mkdir msg
echo "int64 num" > msg/Num.msg
cat Num.msg
int64 num
# 服务
roscd beginner_tutorials
mkdir srv
roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
cat srv/AddTwoInts.srv
int64 a
int64 b
---
int64 sum
在package.xml
文件添加
# 构建时需要"message_generation"
<build_depend>message_generation</build_depend>
# 运行时需要"message_runtime"
<exec_depend>message_runtime</exec_depend>
在CMakeLists.txt
文件:
将message_generation依赖项添加到CMakeLists.txt
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
另外添加运行时的依赖
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES beginner_tutorials
CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
# DEPENDS system_lib
)
添加刚刚创建的消息与服务
## Generate messages in the 'msg' folder
add_message_files(
FILES
# Message1.msg
# Message2.msg
Num.msg
)
## Generate services in the 'srv' folder
add_service_files(
FILES
# Service1.srv
# Service2.srv
AddTwoInts.srv
)
最后需要用到generate_messages()
## Generate added messages and services with any dependencies listed here
generate_messages(
DEPENDENCIES
std_msgs
)
可以查看
rosmsg show beginner_tutorials/Num
int64 num
rossrv show beginner_tutorials/AddTwoInts
int64 a
int64 b
---
int64 sum
3 写一个发布者和接收者
talker.cpp
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
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;
}
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;
}
主要看CMakeLists.txt
文件:
## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
# include
${catkin_INCLUDE_DIRS}
)
# add_executable(${PROJECT_NAME}_node src/beginner_tutorials_node.cpp)
# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
# target_link_libraries(${PROJECT_NAME}_node ${catkin_LIBRARIES})
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_dependencies(talker beginner_tutorials_generate_messages_cpp)
add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(listener beginner_tutorials_generate_messages_cpp)
4 写一个客户端和服务器
add_two_ints_server.cpp
#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h"
bool add(beginner_tutorials::AddTwoInts::Request &req,
beginner_tutorials::AddTwoInts::Response &res)
{
res.sum = req.a + req.b;
ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
ROS_INFO("sending back response: [%ld]", (long int)res.sum);
return true;
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "add_two_ints_server");
ros::NodeHandle n;
ros::ServiceServer service = n.advertiseService("add_two_ints", add);
ROS_INFO("Ready to add two ints.");
ros::spin();
return 0;
}
add_two_ints_client.cpp
#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h"
#include <cstdlib>
int main(int argc, char **argv)
{
ros::init(argc, argv, "add_two_ints_client");
if (argc != 3)
{
ROS_INFO("usage: add_two_ints_client X Y");
return 1;
}
ros::NodeHandle n;
ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");
beginner_tutorials::AddTwoInts srv;
srv.request.a = atoll(argv[1]);
srv.request.b = atoll(argv[2]);
if (client.call(srv))
{
ROS_INFO("Sum: %ld", (long int)srv.response.sum);
}
else
{
ROS_ERROR("Failed to call service add_two_ints");
return 1;
}
return 0;
}
CMakeLists.txt
add_executable(add_two_ints_server src/add_two_ints_server.cpp)
target_link_libraries(add_two_ints_server ${catkin_LIBRARIES})
add_dependencies(add_two_ints_server beginner_tutorials_gencpp)
add_executable(add_two_ints_client src/add_two_ints_client.cpp)
target_link_libraries(add_two_ints_client ${catkin_LIBRARIES})
add_dependencies(add_two_ints_client beginner_tutorials_gencpp)
5 补充:
ubuntu@ubuntu-pc:~/my_workSpace/wiki_ros_tutorials/catkin_ws/src$ ll
总用量 16
drwxr-xr-x 4 ubuntu ubuntu 4096 8月 15 23:40 ./
drwxr-xr-x 5 ubuntu ubuntu 4096 8月 16 15:29 ../
drwxr-xr-x 6 ubuntu ubuntu 4096 8月 16 15:32 beginner_tutorials/
lrwxrwxrwx 1 ubuntu ubuntu 50 8月 15 23:40 CMakeLists.txt -> /opt/ros/melodic/share/catkin/cmake/toplevel.cmake
drwxr-xr-x 4 ubuntu ubuntu 4096 8月 15 22:03 learning_tf/
处理CMakeLists.txt -> /opt/ros/melodic/share/catkin/cmake/toplevel.cmake