ROS中自定义消息的发布和订阅
ROS自定义msg类型及使用
记录我的调试bug历程,
找不到自定义消息类型的文件 bug
找不到.h文件是电脑编译顺序的问题,先把add_executable(swarm_node_v2 src/swarm_node_v2.cpp)
以及
target_link_libraries(swarm_node_v2${catkin_LIBRARIES})
注释,重新运行,给电脑生成.h文件的时间再进行编译。
第二点,各种发布订阅的消息类型要匹配上,如果匹配不上会报错。
第三点,自定义的消息类型的使用规则有一点像C++里面的class类,注意给我们的名字变量链接上。
Echo the topic to each all birds publish their position and see something
是提示我们查看消息类型,rostopic list,rostopic echo /pos 显示最终结果。
pos.name = ros::this_node::getName();
(base) warmtree@warmtree-HP-Pavilion-Laptop-15-cc5xx:~$ cd ros
(base) warmtree@warmtree-HP-Pavilion-Laptop-15-cc5xx:~/ros$ roslaunch swarm XinLAB2part2.launch
RLException: [XinLAB2part2.launch] is neither a launch file in package [swarm] nor is [swarm] a launch file name
The traceback for the exception was written to the log file
(base) warmtree@warmtree-HP-Pavilion-Laptop-15-cc5xx:~/ros$ source devel/setup.bash
(base) warmtree@warmtree-HP-Pavilion-Laptop-15-cc5xx:~/ros$ roslaunch swarm XinLAB2part2.launch
... logging to /home/warmtree/.ros/log/45439a1a-8619-11ea-bc84-60f677506757/roslaunch-warmtree-HP-Pavilion-Laptop-15-cc5xx-10355.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.
started roslaunch server http://warmtree-HP-Pavilion-Laptop-15-cc5xx:37183/
SUMMARY
========
CLEAR PARAMETERS
* /bluesim/blue1/
* /bluesim/blue2/
* /bluesim/blue3/
* /bluesim/blue4/
* /bluesim/blue5/
* /bluesim/blue_swarm/
* /redsim/red1/
* /redsim/red2/
* /redsim/red3/
* /redsim/red4/
* /redsim/red5/
* /redsim/red_swarm/
PARAMETERS
* /bluesim/blue_swarm/move_key: 98
* /redsim/red_swarm/move_key: 114
* /rosdistro: melodic
* /rosversion: 1.14.3
* /world_size: 2.0
NODES
/bluesim/
blue1 (swarm/swarm_node_v2)
blue2 (swarm/swarm_node_v2)
blue3 (swarm/swarm_node_v2)
blue4 (swarm/swarm_node_v2)
blue5 (swarm/swarm_node_v2)
blue_swarm (swarm/swarm_behavior)
/redsim/
red1 (swarm/swarm_node_v2)
red2 (swarm/swarm_node_v2)
red3 (swarm/swarm_node_v2)
red4 (swarm/swarm_node_v2)
red5 (swarm/swarm_node_v2)
red_swarm (swarm/swarm_behavior)
/
teleop (capture_key/capture_key_node)
ROS_MASTER_URI=http://localhost:11311
process[teleop-1]: started with pid [10371]
process[bluesim/blue_swarm-2]: started with pid [10372]
ERROR: cannot launch node of type [swarm/swarm_node_v2]: can't locate node [swarm_node_v2] in package [swarm]
ERROR: cannot launch node of type [swarm/swarm_node_v2]: can't locate node [swarm_node_v2] in package [swarm]
ERROR: cannot launch node of type [swarm/swarm_node_v2]: can't locate node [swarm_node_v2] in package [swarm]
ERROR: cannot launch node of type [swarm/swarm_node_v2]: can't locate node [swarm_node_v2] in package [swarm]
ERROR: cannot launch node of type [swarm/swarm_node_v2]: can't locate node [swarm_node_v2] in package [swarm]
process[redsim/red_swarm-8]: started with pid [10383]
ERROR: cannot launch node of type [swarm/swarm_node_v2]: can't locate node [swarm_node_v2] in package [swarm]
ERROR: cannot launch node of type [swarm/swarm_node_v2]: can't locate node [swarm_node_v2] in package [swarm]
ERROR: cannot launch node of type [swarm/swarm_node_v2]: can't locate node [swarm_node_v2] in package [swarm]
ERROR: cannot launch node of type [swarm/swarm_node_v2]: can't locate node [swarm_node_v2] in package [swarm]
ERROR: cannot launch node of type [swarm/swarm_node_v2]: can't locate node [swarm_node_v2] in package [swarm]
^[[A^C[redsim/red_swarm-8] killing on exit
[bluesim/blue_swarm-2] killing on exit
[teleop-1] killing on exit
shutting down processing monitor...
... shutting down processing monitor complete
done
(base) warmtree@warmtree-HP-Pavilion-Laptop-15-cc5xx:~/ros$ catkin build
-------------------------------------------------------
Profile: default
Extending: [cached] /opt/ros/melodic
Workspace: /home/warmtree/ros
-------------------------------------------------------
Build Space: [exists] /home/warmtree/ros/build
Devel Space: [exists] /home/warmtree/ros/devel
Install Space: [unused] /home/warmtree/ros/install
Log Space: [exists] /home/warmtree/ros/logs
Source Space: [exists] /home/warmtree/ros/src
DESTDIR: [unused] None
-------------------------------------------------------
Devel Space Layout: linked
Install Space Layout: None
-------------------------------------------------------
Additional CMake Args: None
Additional Make Args: None
Additional catkin Make Args: None
Internal Make Job Server: True
Cache Job Environments: False
-------------------------------------------------------
Whitelisted Packages: None
Blacklisted Packages: None
-------------------------------------------------------
Workspace configuration appears valid.
-------------------------------------------------------
[build] Found '2' packages in 0.0 seconds.
[build] Package table is up to date.
Starting >>> capture_key
Starting >>> swarm
Finished <<< capture_key [ 0.2 seconds ]
_______________________________________________________________________________
Errors << swarm:check /home/warmtree/ros/logs/swarm/build.check.012.log
CMake Error at /home/warmtree/ros/src/swarm/CMakeLists.txt:111 (add_executable):
add_executable cannot create target "swarm_node" because another target
with the same name already exists. The existing target is an executable
created in source directory "/home/warmtree/ros/src/swarm". See
documentation for policy CMP0002 for more details.
CMake Error at /home/warmtree/ros/src/swarm/CMakeLists.txt:122 (target_link_libraries):
Cannot specify link libraries for target "swarm_node_v2" which is not built
by this project.
make: *** [cmake_check_build_system] Error 1
cd /home/warmtree/ros/build/swarm; catkin build --get-env swarm | catkin env -si /usr/bin/make cmake_check_build_system; cd -
...............................................................................
Failed << swarm:check [ Exited with code 2 ]
Failed <<< swarm [ 1.0 seconds ]
[build] Summary: 1 of 2 packages succeeded.
[build] Ignored: None.
[build] Warnings: None.
[build] Abandoned: None.
[build] Failed: 1 packages failed.
[build] Runtime: 1.0 seconds total.
(base) warmtree@warmtree-HP-Pavilion-Laptop-15-cc5xx:~/ros$ catkin build
-------------------------------------------------------
Profile: default
Extending: [cached] /opt/ros/melodic
Workspace: /home/warmtree/ros
-------------------------------------------------------
Build Space: [exists] /home/warmtree/ros/build
Devel Space: [exists] /home/warmtree/ros/devel
Install Space: [unused] /home/warmtree/ros/install
Log Space: [exists] /home/warmtree/ros/logs
Source Space: [exists] /home/warmtree/ros/src
DESTDIR: [unused] None
-------------------------------------------------------
Devel Space Layout: linked
Install Space Layout: None
-------------------------------------------------------
Additional CMake Args: None
Additional Make Args: None
Additional catkin Make Args: None
Internal Make Job Server: True
Cache Job Environments: False
-------------------------------------------------------
Whitelisted Packages: None
Blacklisted Packages: None
-------------------------------------------------------
Workspace configuration appears valid.
-------------------------------------------------------
[build] Found '2' packages in 0.0 seconds.
[build] Package table is up to date.
Starting >>> capture_key
Starting >>> swarm
Finished <<< capture_key [ 0.2 seconds ]
_______________________________________________________________________________
Errors << swarm:check /home/warmtree/ros/logs/swarm/build.check.013.log
CMake Error at /home/warmtree/ros/src/swarm/CMakeLists.txt:122 (target_link_libraries):
Cannot specify link libraries for target "swarm_node_v2" which is not built
by this project.
make: *** [cmake_check_build_system] Error 1
cd /home/warmtree/ros/build/swarm; catkin build --get-env swarm | catkin env -si /usr/bin/make cmake_check_build_system; cd -
...............................................................................
Failed << swarm:check [ Exited with code 2 ]
Failed <<< swarm [ 1.0 seconds ]
[build] Summary: 1 of 2 packages succeeded.
[build] Ignored: None.
[build] Warnings: None.
[build] Abandoned: None.
[build] Failed: 1 packages failed.
[build] Runtime: 1.0 seconds total.
(base) warmtree@warmtree-HP-Pavilion-Laptop-15-cc5xx:~/ros$ source devel/setup.bash
(base) warmtree@warmtree-HP-Pavilion-Laptop-15-cc5xx:~/ros$ catkin build
-------------------------------------------------------
Profile: default
Extending: [cached] /opt/ros/melodic
Workspace: /home/warmtree/ros
-------------------------------------------------------
Build Space: [exists] /home/warmtree/ros/build
Devel Space: [exists] /home/warmtree/ros/devel
Install Space: [unused] /home/warmtree/ros/install
Log Space: [exists] /home/warmtree/ros/logs
Source Space: [exists] /home/warmtree/ros/src
DESTDIR: [unused] None
-------------------------------------------------------
Devel Space Layout: linked
Install Space Layout: None
-------------------------------------------------------
Additional CMake Args: None
Additional Make Args: None
Additional catkin Make Args: None
Internal Make Job Server: True
Cache Job Environments: False
-------------------------------------------------------
Whitelisted Packages: None
Blacklisted Packages: None
-------------------------------------------------------
Workspace configuration appears valid.
-------------------------------------------------------
[build] Found '2' packages in 0.0 seconds.
[build] Package table is up to date.
Starting >>> capture_key
Starting >>> swarm
Finished <<< capture_key [ 0.2 seconds ]
_______________________________________________________________________________
Errors << swarm:check /home/warmtree/ros/logs/swarm/build.check.014.log
CMake Error at /home/warmtree/ros/src/swarm/CMakeLists.txt:122 (target_link_libraries):
Cannot specify link libraries for target "swarm_node_v2" which is not built
by this project.
make: *** [cmake_check_build_system] Error 1
cd /home/warmtree/ros/build/swarm; catkin build --get-env swarm | catkin env -si /usr/bin/make cmake_check_build_system; cd -
...............................................................................
Failed << swarm:check [ Exited with code 2 ]
Failed <<< swarm [ 0.9 seconds ]
[build] Summary: 1 of 2 packages succeeded.
[build] Ignored: None.
[build] Warnings: None.
[build] Abandoned: None.
[build] Failed: 1 packages failed.
[build] Runtime: 0.9 seconds total.
(base) warmtree@warmtree-HP-Pavilion-Laptop-15-cc5xx:~/ros$ catkin build
-------------------------------------------------------
Profile: default
Extending: [cached] /opt/ros/melodic
Workspace: /home/warmtree/ros
-------------------------------------------------------
Build Space: [exists] /home/warmtree/ros/build
Devel Space: [exists] /home/warmtree/ros/devel
Install Space: [unused] /home/warmtree/ros/install
Log Space: [exists] /home/warmtree/ros/logs
Source Space: [exists] /home/warmtree/ros/src
DESTDIR: [unused] None
-------------------------------------------------------
Devel Space Layout: linked
Install Space Layout: None
-------------------------------------------------------
Additional CMake Args: None
Additional Make Args: None
Additional catkin Make Args: None
Internal Make Job Server: True
Cache Job Environments: False
-------------------------------------------------------
Whitelisted Packages: None
Blacklisted Packages: None
-------------------------------------------------------
Workspace configuration appears valid.
-------------------------------------------------------
[build] Found '2' packages in 0.0 seconds.
[build] Package table is up to date.
Starting >>> capture_key
Starting >>> swarm
Finished <<< capture_key [ 0.2 seconds ]
_______________________________________________________________________________
Errors << swarm:make /home/warmtree/ros/logs/swarm/build.make.012.log
/home/warmtree/ros/src/swarm/src/swarm_node_v2.cpp: In function ‘int main(int, char**)’:
/home/warmtree/ros/src/swarm/src/swarm_node_v2.cpp:130:47: error: ‘NameAndPose’ was not declared in this scope
ros::Publisher pubPos = nh_glob.advertise<NameAndPose::Point>("/pos",1);
^~~~~~~~~~~
/home/warmtree/ros/src/swarm/src/swarm_node_v2.cpp:130:37: error: parse error in template argument list
ros::Publisher pubPos = nh_glob.advertise<NameAndPose::Point>("/pos",1);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/warmtree/ros/src/swarm/src/swarm_node_v2.cpp:130:75: error: no matching function for call to ‘ros::NodeHandle::advertise<<expression error> >(const char [5], int)’
ros::Publisher pubPos = nh_glob.advertise<NameAndPose::Point>("/pos",1);
^
In file included from /opt/ros/melodic/include/ros/ros.h:45:0,
from /home/warmtree/ros/src/swarm/src/swarm_node_v2.cpp:40:
/opt/ros/melodic/include/ros/node_handle.h:249:15: note: candidate: template<class M> ros::Publisher ros::NodeHandle::advertise(const string&, uint32_t, bool)
Publisher advertise(const std::string& topic, uint32_t queue_size, bool latch = false)
^~~~~~~~~
/opt/ros/melodic/include/ros/node_handle.h:249:15: note: template argument deduction/substitution failed:
/home/warmtree/ros/src/swarm/src/swarm_node_v2.cpp:130:75: error: template argument 1 is invalid
ros::Publisher pubPos = nh_glob.advertise<NameAndPose::Point>("/pos",1);
^
In file included from /opt/ros/melodic/include/ros/ros.h:45:0,
from /home/warmtree/ros/src/swarm/src/swarm_node_v2.cpp:40:
/opt/ros/melodic/include/ros/node_handle.h:315:13: note: candidate: template<class M> ros::Publisher ros::NodeHandle::advertise(const string&, uint32_t, const SubscriberStatusCallback&, const SubscriberStatusCallback&, const VoidConstPtr&, bool)
Publisher advertise(const std::string& topic, uint32_t queue_size,
^~~~~~~~~
/opt/ros/melodic/include/ros/node_handle.h:315:13: note: template argument deduction/substitution failed:
/home/warmtree/ros/src/swarm/src/swarm_node_v2.cpp:130:75: error: template argument 1 is invalid
ros::Publisher pubPos = nh_glob.advertise<NameAndPose::Point>("/pos",1);
^
make[2]: *** [CMakeFiles/swarm_node_v2.dir/src/swarm_node_v2.cpp.o] Error 1
make[1]: *** [CMakeFiles/swarm_node_v2.dir/all] Error 2
make: *** [all] Error 2
cd /home/warmtree/ros/build/swarm; catkin build --get-env swarm | catkin env -si /usr/bin/make --jobserver-fds=4,5 -j; cd -
...............................................................................
Failed << swarm:make [ Exited with code 2 ]
Failed <<< swarm [ 2.6 seconds ]
[build] Summary: 1 of 2 packages succeeded.
[build] Ignored: None.
[build] Warnings: None.
[build] Abandoned: None.
[build] Failed: 1 packages failed.
[build] Runtime: 2.6 seconds total.
(base) warmtree@warmtree-HP-Pavilion-Laptop-15-cc5xx:~/ros$ catkin build
-------------------------------------------------------
Profile: default
Extending: [cached] /opt/ros/melodic
Workspace: /home/warmtree/ros
-------------------------------------------------------
Build Space: [exists] /home/warmtree/ros/build
Devel Space: [exists] /home/warmtree/ros/devel
Install Space: [unused] /home/warmtree/ros/install
Log Space: [exists] /home/warmtree/ros/logs
Source Space: [exists] /home/warmtree/ros/src
DESTDIR: [unused] None
-------------------------------------------------------
Devel Space Layout: linked
Install Space Layout: None
-------------------------------------------------------
Additional CMake Args: None
Additional Make Args: None
Additional catkin Make Args: None
Internal Make Job Server: True
Cache Job Environments: False
-------------------------------------------------------
Whitelisted Packages: None
Blacklisted Packages: None
-------------------------------------------------------
Workspace configuration appears valid.
-------------------------------------------------------
[build] Found '2' packages in 0.0 seconds.
[build] Package table is up to date.
Starting >>> capture_key
Starting >>> swarm
Finished <<< capture_key [ 0.2 seconds ]
_______________________________________________________________________________
Errors << swarm:make /home/warmtree/ros/logs/swarm/build.make.013.log
/home/warmtree/ros/src/swarm/src/swarm_node_v2.cpp: In function ‘int main(int, char**)’:
/home/warmtree/ros/src/swarm/src/swarm_node_v2.cpp:130:47: error: ‘NameAndPose’ was not declared in this scope
ros::Publisher pubPos = nh_glob.advertise<NameAndPose::Point>("/pos",1);
^~~~~~~~~~~
/home/warmtree/ros/src/swarm/src/swarm_node_v2.cpp:130:47: note: suggested alternative:
In file included from /home/warmtree/ros/src/swarm/src/swarm_node_v2.cpp:45:0:
/home/warmtree/ros/devel/.private/swarm/include/swarm/NameAndPose.h:54:54: note: ‘swarm::NameAndPose’
typedef ::swarm::NameAndPose_<std::allocator<void> > NameAndPose;
^~~~~~~~~~~
/home/warmtree/ros/src/swarm/src/swarm_node_v2.cpp:130:37: error: parse error in template argument list
ros::Publisher pubPos = nh_glob.advertise<NameAndPose::Point>("/pos",1);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/warmtree/ros/src/swarm/src/swarm_node_v2.cpp:130:75: error: no matching function for call to ‘ros::NodeHandle::advertise<<expression error> >(const char [5], int)’
ros::Publisher pubPos = nh_glob.advertise<NameAndPose::Point>("/pos",1);
^
In file included from /opt/ros/melodic/include/ros/ros.h:45:0,
from /home/warmtree/ros/src/swarm/src/swarm_node_v2.cpp:40:
/opt/ros/melodic/include/ros/node_handle.h:249:15: note: candidate: template<class M> ros::Publisher ros::NodeHandle::advertise(const string&, uint32_t, bool)
Publisher advertise(const std::string& topic, uint32_t queue_size, bool latch = false)
^~~~~~~~~
/opt/ros/melodic/include/ros/node_handle.h:249:15: note: template argument deduction/substitution failed:
/home/warmtree/ros/src/swarm/src/swarm_node_v2.cpp:130:75: error: template argument 1 is invalid
ros::Publisher pubPos = nh_glob.advertise<NameAndPose::Point>("/pos",1);
^
In file included from /opt/ros/melodic/include/ros/ros.h:45:0,
from /home/warmtree/ros/src/swarm/src/swarm_node_v2.cpp:40:
/opt/ros/melodic/include/ros/node_handle.h:315:13: note: candidate: template<class M> ros::Publisher ros::NodeHandle::advertise(const string&, uint32_t, const SubscriberStatusCallback&, const SubscriberStatusCallback&, const VoidConstPtr&, bool)
Publisher advertise(const std::string& topic, uint32_t queue_size,
^~~~~~~~~
/opt/ros/melodic/include/ros/node_handle.h:315:13: note: template argument deduction/substitution failed:
/home/warmtree/ros/src/swarm/src/swarm_node_v2.cpp:130:75: error: template argument 1 is invalid
ros::Publisher pubPos = nh_glob.advertise<NameAndPose::Point>("/pos",1);
^
make[2]: *** [CMakeFiles/swarm_node_v2.dir/src/swarm_node_v2.cpp.o] Error 1
make[1]: *** [CMakeFiles/swarm_node_v2.dir/all] Error 2
make: *** [all] Error 2
cd /home/warmtree/ros/build/swarm; catkin build --get-env swarm | catkin env -si /usr/bin/make --jobserver-fds=4,5 -j; cd -
...............................................................................
Failed << swarm:make [ Exited with code 2 ]
Failed <<< swarm [ 1.8 seconds ]
[build] Summary: 1 of 2 packages succeeded.
[build] Ignored: None.
[build] Warnings: None.
[build] Abandoned: None.
[build] Failed: 1 packages failed.
[build] Runtime: 1.8 seconds total.
(base) warmtree@warmtree-HP-Pavilion-Laptop-15-cc5xx:~/ros$ catkin build
-------------------------------------------------------
Profile: default
Extending: [cached] /opt/ros/melodic
Workspace: /home/warmtree/ros
-------------------------------------------------------
Build Space: [exists] /home/warmtree/ros/build
Devel Space: [exists] /home/warmtree/ros/devel
Install Space: [unused] /home/warmtree/ros/install
Log Space: [exists] /home/warmtree/ros/logs
Source Space: [exists] /home/warmtree/ros/src
DESTDIR: [unused] None
-------------------------------------------------------
Devel Space Layout: linked
Install Space Layout: None
-------------------------------------------------------
Additional CMake Args: None
Additional Make Args: None
Additional catkin Make Args: None
Internal Make Job Server: True
Cache Job Environments: False
-------------------------------------------------------
Whitelisted Packages: None
Blacklisted Packages: None
-------------------------------------------------------
Workspace configuration appears valid.
-------------------------------------------------------
[build] Found '2' packages in 0.0 seconds.
[build] Package table is up to date.
Starting >>> capture_key
Starting >>> swarm
Finished <<< capture_key [ 0.2 seconds ]
_______________________________________________________________________________
Errors << swarm:make /home/warmtree/ros/logs/swarm/build.make.014.log
/home/warmtree/ros/src/swarm/src/swarm_node_v2.cpp: In function ‘int main(int, char**)’:
/home/warmtree/ros/src/swarm/src/swarm_node_v2.cpp:130:67: error: invalid use of non-static data member ‘swarm::NameAndPose_<std::allocator<void> >::Point’
ros::Publisher pubPos = nh_glob.advertise<swarm::NameAndPose::Point>("/pos",1);
^~~~~
In file included from /home/warmtree/ros/src/swarm/src/swarm_node_v2.cpp:45:0:
/home/warmtree/ros/devel/.private/swarm/include/swarm/NameAndPose.h:43:15: note: declared here
_Point_type Point;
^~~~~
/home/warmtree/ros/src/swarm/src/swarm_node_v2.cpp:130:82: error: no matching function for call to ‘ros::NodeHandle::advertise<<expression error> >(const char [5], int)’
ros::Publisher pubPos = nh_glob.advertise<swarm::NameAndPose::Point>("/pos",1);