参考:https://blog.csdn.net/moshuilangting/article/details/86484042
1、新建工作空间并创建新的ros包
mkdir chat_test_msg
cd chat_test_msg
mkdir src
cd src
catkin_create_pkg chat_my std_msgs rospy roscpp ##功能包名为chat_my,注意后面的依赖
此时src文件夹下出现chat_my文件夹
chat_my文件夹下包含: 2个文件夹 include 、src;2个文件 CmakeLists.txt 、package.xml
2、使用msg
新建 .msg 文件
cd chat_my
mkdir msg ##新建msg文件夹,和上面的include等同一路径
cd msg
gedit test.msg ##进入msg路径,新建 .msg 文件 这个名字后面要用
输入消息
string s
float32 x
float32 y
如图所示
3、修改package.xml
找到下面两句并取消注释,(注释与取消注释的方法参考文件内其他内容)
<build_depend>message_generation</build_depend> ##取消注释
<exec_depend>message_runtime</exec_depend> ##取消注释
4、修改CmakeLists.txt
注意修改以下地方,注意取消注释和添加语句
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation ##新添加++
)
add_message_files( ##取消注释
FILES ##取消注释
test.msg ##新添加++,就是我们新建的.msg文件
) ##取消注释
generate_messages( ##取消注释
DEPENDENCIES ##取消注释
std_msgs ##取消注释
) ##取消注释
以下注意要添加语句
catkin_package(
CATKIN_DEPENDS message_runtime roscpp rospy std_msgs ##取消注释,##添加++ message_runtime
)
修改完后 回到工作空间进行编译(要在只有src的文件目录下执行catkin_make)
cd ../
catkin_make
5、话题发布与订阅
在src文件夹下新建两个.cpp文件 talker.cpp listener.cpp
分别输入如下代码
talker.cpp
#include <sstream>
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "chat_my/test.h" //前面是包的名字,后面是.msg的名字,注意这里后缀要将.msg改为.h
int main(int argc,char **argv)
{
ros::init(argc,argv,"talker"); //节点初始化
ros::NodeHandle n; //创建节点句柄
ros::Publisher chatter_pub=n.advertise<chat_my::test>("chatter",1000);///创建publisher,发布名为chatter,类型为chat_my::test(这里是自己定义的话题消息,注意格式),队列大小为1000
chat_my::test num; //定义一个话题消息变量
ros::Rate lopp_rate(10); //设置循环的频率10hz,调用Rate::sleep()时,会休眠一定时间保证频率
int count=0.0;
while(ros::ok) //节点有异常时,ros::ok 返回false
{
//初始化要发布的消息
num.x=10.1;
num.y=count;
num.s='talker';
//发布消息
chatter_pub.publish(num);
ROS_INFO("I publish:x=%f,y=%f,z=%s",num.x,num.y,num.s);
//循环等待回调函数
ros::spinOnce();
//按照循环频率延时
lopp_rate.sleep();
++count;
}
return 0;
}
listener.cpp
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "chat_my/test.h" //前面是包的名字,后面是.msg的名字,注意这里后缀要将.msg改为.h
void chatterCallback_1(const chat_my::test::ConstPtr& msg)//注意此处要更改话题消息类型
{
//打印收到的消息
ROS_INFO("I heard:x=%f,y=%f,z=%s",msg->x,msg->y,msg->s);
}
int main(int argc,char **argv)
{
ros::init(argc,argv,"listener");
ros::NodeHandle n;
ros::Subscriber sub=n.subscribe("chatter",1000,chatterCallback_1); //创建一个Subscriber,订阅名为chatter,回调函数
ros::spin(); //循环等待回调函数
return 0;
}
6、修改Cmakelists.txt文件,并编译,运行
在Cmakelists.txt中添加如下代码
add_executable(talker src/talker.cpp) #手动添加 第一个是可执行文件的文件名,后面是源,可以多个,用空格隔开
target_link_libraries(talker ${catkin_LIBRARIES}) #此可执行文件所需的链接库,第一个可执行文件名,后面为链接库,可多个,用空格隔开
add_executable(listener src/listener.cpp) #手动添加 第一个是可执行文件的文件名,后面是源,可以多个,用空格隔开
target_link_libraries(listener ${catkin_LIBRARIES}) #此可执行文件所需的链接库,第一个可执行文件名,后面为链接库,可多个,用空格隔开
回到工作空间,编译
catkin_make
注意,此处如果报错,可以尝试将build 和devel 文件夹删掉,重新编译
运行:
新建终端
roscore
在工作空间下新建终端,输入如下命令,(如果是zsh的terminal,第一条需要修改为source devel/setup.zsh)
source devel/setup.bash
rosrun chat_my talker ##第一个为功能包名,第二个对应Cmakelists.txt中的可执行文件名
此时如果正常,终端将打印发送的一系列数
在工作空间下新建终端
source devel/setup.bash
rosrun chat_my listener
此时如果正常,终端将打印接受到的一系列数
查看节点关系,新建终端输入如下指令
rqt_graph
当更改工作空间名字后,需要删掉build 和devel 两个文件夹,重新编译
action通信相关参考
https://blog.csdn.net/qq_23981335/article/details/100335743
https://blog.csdn.net/java0fu/article/details/106148794
https://blog.csdn.net/zxxxiazai/article/details/108396429