首先,给出示例的网址http://wiki.ros.org/ROS/Tutorials(本身有例程,不过部分有问题或者不够详尽)
本例的工作空间是在个人目录中的workspace文件夹表示为~/workspace或者/home/(你的用户名)/workspace
1、配置环境,创建程序包,编译程序包;
-
$ source /opt/ros/kinetic/setup.bash 在当前bash环境下读取并执行setup.bash中的命令。
-
$ mkdir -p ~/workspace/src 在工作目录下创建src文件夹-p(目的)no error if existing, make parent directories as needed
-
$ catkin_make 此时你的目录应该是在~/workspace下,如果进入了src目录可输入cd ..到上层目录(可能这步会报错,后面有解法)
-
$ echo $ROS_PACKAGE_PATH 查看ros中最重要的环境变量是否设置成功(成功的标志应该是路径中有指向当前工作空间的路径,长这样:/home/你的用户名/workspace/src:/opt/ros/kinetic/share)如果未成功,则要在工作目录~/workspace下执行:
$ source devel/setup.bash,在当前终端应用环境变量.
- 进入~/workspace/src 执行:$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp 然后返回workspace目录
- $catkin_make 到此时程序包已经编译完成,使用$roscd beginner_tutorials应该可以直接进入该包的目录(~/workspace/src/beginner_tutorials)了.(可能这步会报错,后面有解法)
2、创建ROS消息和ROS服务:
- $ roscd beginner_tutorials 如果完成了上面的所有操作,此步骤应该不会报错(如果报错请执行文末的错误解决方法)
- $ mkdir msg 在包文件目录下创建msg文件夹
- $ echo "int64 num" > msg/Num.msg 将引号内的内容写入Num.msg中
- 打开包目录(beginner_tutorials)下CMakeLists.txt文件,在find_package函数的参数列表中添加message_generation,(不包含逗号)在catkin_package函数参数列表中添加CATKIN_DEPENDS message_runtime,(不包含逗号)找到
# add_message_files( # FILES # Message1.msg # Message2.msg # )将所有#号删除,删除Message1.msg和Message2.msg,添加Num.msg,,(不包含逗号)(后面这句用来暂时添加,在执行完最后一句后编译前将这句删除(因为在之前需要有将被注释的这句话释放出来添加依赖项))在最后添加一行,generate_messages()保存
-
$ rosmsg show beginner_tutorials/Num 此时应该就能看到之前输入到文件中的内容
-
$ roscd beginner_tutorials 回到包目录下
-
$ mkdir srv 创建服务文件夹
-
$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv 从rospy中拷贝一个服务出来
-
CMakeLists.txt文件中
- # add_service_files(
- # FILES
- # Service1.srv
- # Service2.srv
- # )将所有#号删除,删除Service1.srv和Service2.srv,添加AddTwoInts.srv,(不包含逗号),保存退出
-
$ rossrv show beginner_tutorials/AddTwoInts 此时应该就能看到int64 a int64 b --- int64 sum
- 在CMakeLists.txt文件中找到
# generate_messages( # DEPENDENCIES # # std_msgs # Or other packages containing msgs # )去掉注释并附加上所有你消息文件所依赖的那些含有.msg文件的package(这个例子是依赖std_msgs,不要添加roscpp,rospy),结果如下:
generate_messages( DEPENDENCIES std_msgs )
- 返回到~/workspace重新输入$ catkin_make编译
3、编写简单的消息发布器和订阅器 (C++)
-
$ mkdir -p ~/workspace/src/beginner_tutorials/src 在包目录下新建c++源码存放文件夹
- 将两个cpp文件放入源码文件夹,源码地址:发布器:https://raw.github.com/ros/ros_tutorials/groovy-devel/roscpp_tutorials/talker/talker.cpp接收器:https://raw.github.com/ros/ros_tutorials/groovy-devel/roscpp_tutorials/listener/listener.cpp
- $ roscd beginner_tutorials 包目录下编辑CMakeLists.txt文件,在文件末尾添加(此处需要还原上一例修改的该文件,该注释的注释该删的删,如果无法回复可从此处下载覆盖https://raw.github.com/ros/catkin_tutorials/master/create_package_pubsub/catkin_ws/src/beginner_tutorials/CMakeLists.txt)
include_directories(include ${catkin_INCLUDE_DIRS}) add_executable(talker src/talker.cpp) target_link_libraries(talker ${catkin_LIBRARIES}) add_executable(listener src/listener.cpp) target_link_libraries(listener ${catkin_LIBRARIES})
- 在~/workspace目录下执行catkin_make
- 测试:当前终端执行$ roscore 另起终端$ rosrun beginner_tutorials talker 另起终端$ rosrun beginner_tutorials listener
- 可见完美的跑起来了
大部分错误解法:经多次尝试和搜索发现都是环境变量未生效等等配置未能实现,需要每次启动终端输入source ~/workspace/devel/setup.bash即可,由于每次打开都要输入该指令太过繁琐,只需执行:$ vim ~/.bashrc在文件最后输入source ~/workspace/devel/setup.bash即可