创建工作空间与功能包
工作空间(workspace)是一个存放工程开发
相关文件的文件夹。
• src:代码空间(Source Space)
• build:编译空间(Build Space)
• devel:开发空间(Development Space)
• install:安装空间(Install Space)
创建工作空间
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
编译工作空间
注意编译工作空间时需要在创建的根目录catkin_ws下执行命令catkin_make
cd ~/catkin_ws/
catkin_make
设置环境变量
source devel/setup.bash
检查环境变量
echo $ROS_PACKAGE_PATH
在工作环境下通过一下命令生成install文件夹。
catkin_make install
创建功能包
创建功能包是在工作空间catkin_ws中的src文件夹中,格式为:
catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
在下列命令中test_pkg是功能包的名字,而后面的是依赖包。
cd ~/catkin_ws/src
catkin_create_pkg test_pkg std_msgs rospy roscpp
编译功能包
编译功能包依旧是在工作空间根目录下。
source ~/catkin_ws/devel/setup.bash为设置环境变量。
如果不将该环境变量设置成默认值,则在每次编译完成后都需要设置环境变量。
也可以在.bashrc文件最后直接添加source devel/setup.bash,然后重新打开终端,这样以后不用再设置环境变量。
.bashrc:(此为隐藏文件)在home文件在通过Ctrl /H显示隐藏文件,再次Ctrl /H可以再次隐藏文件。
cd ~/catkin_ws
catkin_make
source ~/catkin_ws/devel/setup.bash
在功能包创建完成后可以在自动生成的文件CMakeLists.txt和package.xml中查看该功能包的详细信息,如该功能包的依赖包等。
发布者Publisher的编程实现
创建一个发布者向仿生节点发布数据信息。
$ cd ~/catkin_ws/src
$ catkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim
在learning_topic/src中创建发布者代码(C++/python)
C++:
/**
* 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist
*/
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
int main(int argc, char **argv)
{
// ROS节点初始化
ros::init(argc, argv, "velocity_publisher");
// 创建节点句柄
ros::NodeHandle n;
// 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);
// 设置循环的频率
ros::Rate loop_rate(10);
int count = 0;
while (ros::ok())
{
// 初始化geometry_msgs::Twist类型的消息
geometry_msgs::Twist vel_msg;
vel_msg.linear.x = 0.5;
vel_msg.angular.z = 0.2;
// 发布消息
turtle_vel_pub.publish(vel_msg);
ROS_INFO("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]",
vel_msg.linear.x, vel_msg.angular.z);
// 按照循环频率延时
loop_rate.sleep();
}
return 0;
}
注意.cpp文件并非是可执行文件,需要编译成可执行文件,而编译过程是在编译功能包时同时执行。打开该功能包的CMakeLists.txt 文件,找到编译相关的部分(该文件中包含许多注释,注明了常见的用法)。
在编译区添加:
add_executable(velocity_publisher src/velocity_publisher.cpp) target_link_libraries(velocity_publisher ${catkin_LIBRARIES})
该代码的具体作用可参考编译注释。
然后回到工作空间根目录编译功能包后就可以运行该功能包中的节点了。
$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun learning_topic velocity_publisher
python:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist
import rospy
from geometry_msgs.msg import Twist
def velocity_publisher():
# ROS节点初始化
rospy.init_node('velocity_publisher_py', anonymous=True)
# 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
turtle_vel_pub = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10)
#设置循环的频率
rate = rospy.Rate(10)
while not rospy.is_shutdown():
# 初始化geometry_msgs::Twist类型的消息
vel_msg = Twist()
vel_msg.linear.x = 0.5
vel_msg.angular.z = 0.2
# 发布消息
turtle_vel_pub.publish(vel_msg)
rospy.loginfo("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]", vel_msg.linear.x, vel_msg.angular.z)
# 按照循环频率延时
rate.sleep()
if __name__ == '__main__':
try:
velocity_publisher()
except rospy.ROSInterruptException:
pass
创建功能包步骤相似,此处不在赘述。但请注意.py文件时可执行文件不需要进行编译过程,也就是无需向CMakeLists.txt 文件中添加任何东西。
还需注意查看.py文件的属性,检查该文件是否允许执行。
然后同.cpp文件一样回到工作空间根目录编译功能包。
注意:由于.py文件不同于.cpp文件,它不需要编译过程,即.py文件中存在问题时功能包编译也不会报错,而是在运行该节点(.py)时才会报错。
常见错误:ImportError: No module named yaml
解决方案:sudo apt-get install python-yaml
(在windows系统下为pip install pyyaml)
ImportError: No module named rospkg
这个问题也时困扰我好久的一个坑,如何跳出该坑请看下面。
根据出错原因本应该去安装rospkg,但是安装又会有以下问题:
提示却显示rospkg已安装,但是却报错。造成该原因的是使用的python版本不对。很多指导不管rospkg存在的路径一味的python版本改成Python2.7。正确操作时找到rospkg安装在哪个版本的python下,然后通过以下命令修改:
sudo update-alternatives --config python