-
如何建立工作空间
在终端(通过快捷键Ctrl+Alt+T打开)中执行如下命令:
mkdir -p ~/catkin_ws/src
到此,一个空白的工作空间已建立好了,”~/catkin_ws” 即为工作空间(~是主文件夹,即 ”/home/用户名”;工作空间也可被命为其它名字)。包将建立在工作空间中的src文件夹中。 -
如何建立包
在终端中执行如下命令:
cd ~/catkin_ws/src # 将当前路径切换到catkin工作空间中的src目录
catkin_create_pkg hello_robot std_msgs roscpp
该命令创建了一个名为 “hello_robot” 的新程序包,这个程序包依赖于std_msgs和roscpp。实际上是创建了一个名为beginner_tutorials的文件夹,并在文件夹中自动生成一个package.xml文件和一个CMakeLists.txt文件。
3.建立消息.msg文件
(1) 建立.msg文件:
cd ~/catkin_ws/src/hello_robot
mkdir msg
gedit msg/RobotMsg.msg
(此处按照协议及型号类型修改确定 例此处的msg名为 RobotMsg)
4.修改 hello_robot 文件夹下的 package.xml 文件
查看package.xml文件(可通过gedit打开,下同),确保它包含以下两条语句。如果没有,添加进去:
<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>
或者是
<exec_depend>message_runtime</exec_depend>
看情况确定
5.修改 hello_robot 文件夹下的 CMakeList.txt 文件
编辑CMakeLists.txt文件:
找到 find_package 函数,增加对message_generation的依赖。如下所示:
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
message_generation
)
找到 catkin_package 函数,确保设置了运行依赖,修改为 如下所示:
catkin_package(
#INCLUDE_DIRS include
#LIBRARIES hello_robot
#CATKIN_DEPENDS roscpp std_msgs
CATKIN_DEPENDS message_runtime
#DEPENDS system_lib
)
找到 add_message_files 函数,去掉注释符号#并添加自定义消息文件,修改为 如下所示:
add_message_files(
FILES
RobotMsg.msg #此处为msg的文件名
Time.msg #有更多的msg 就添加进去
)
找到 generate_messages 函数,去掉注释符号#,修改为 如下所示:
generate_messages(
DEPENDENCIES
std_msgs
)
- 在根工作空间下打开终端
/catkin_ws
输入指令
catkin_make
将msg生成为.h文件 存储于 /devel/include/包名/msg名.h
之后将此 msg名.h 文件拿出来放到自己的工程中就能用了
使用过程:
发布消息的例子
#define USEROS 10
//头文件
#if USEROS
#include"ros/ros.h"
#endif
#include"ros/k4.h"
//初始化ROS消息 接收ROS提供的消息
ros::init(argc, argv, "projectK4v1");
//建立结点
ros::NodeHandle n;
//建立发布者,绑定结点n,消息名称为boatK4
ros::Publisher chatter_pub=n.advertise<boat::k4>("boatK4",1);
//建立消息
boat::k4 tmp;
//修改消息
tmp.leftDegree = getAngle(bbox_left);
tmp.rightDegree = getAngle(bbox_right);
//发布消息
chatter_pub.publish(tmp);
//更新ros消息 这里只放了发送,因此其实不需要,但是为了方便修改了接收的因此加上
ros::spinOnce();
接收消息的例子
//定义回调函数 接到ros消息就反应,思路是先建立全局变量,然后在里面修改全局变量,注意函数的参数
const AutoDriveBoat::NavigationInfo::ConstPtr& msg 分别是 命名空间(是ros包的名字)::头文件名(是msg文件名字)::ConstPtr& msg
void RosNavigation(const AutoDriveBoat::NavigationInfo::ConstPtr& msg)
{
BoatInfoMsg.Longitude=msg->Longitude;BoatInfoMsg.Latitude=msg->Latitude;
//
BoatInfoMsg.Gauss_X=msg->Gauss_X;BoatInfoMsg.Gauss_Y=msg->Gauss_Y;
//
BoatInfoMsg.Course=msg->Course;
BoatInfoMsg.Speed=msg->Speed;
BoatInfoMsg.speed_vx=msg->speed_vx;BoatInfoMsg.speed_vy=msg->speed_vy;
BoatInfoMsg.speed_vz=msg->speed_vz;
//
BoatInfoMsg.mu=msg->mu;//绕X轴旋转角度 顺时针为正 船抬头为正 俯仰角
BoatInfoMsg.alapha=msg->alapha;//绕Y轴旋转角度 顺时针为正 船右翻为正 翻滚角
BoatInfoMsg.beta=msg->beta;
//
BoatInfoMsg.Q=msg->Q;
BoatInfoMsg.P=msg->P;
BoatInfoMsg.R=msg->R;
BoatInfoMsg.Time_Stamp=msg->Time_Stamp;
BoatInfoMsg.Fault_Flag=msg->Fault_Flag;
}
void RosTarget(const boat::target::ConstPtr& msg)
{
targetCoord.x=msg->targetCoordX;
targetCoord.y=msg->targetCoordY;
targetRecvivedTimes=20;
targetRecvivedBool=true;
printf("\n\nboat::target %.1f,%.1f\n\n\n",targetCoord.x,targetCoord.y);
}
//初始化ROS消息 接收ROS提供的消息
ros::init(argc, argv, "projectK5v3");
ros::NodeHandle n,n2,n3;
ros::Subscriber sub,sub2;
sub = n.subscribe("NavigationInfo",1,RosNavigation);
sub2 = n2.subscribe("TargetCoordH2C",1,RosTarget);
ros::Publisher chatter_pub=n3.advertise<boat::k5>("boatK5",1);
//接收ROS消息
ros::spinOnce();
chatter_pub.publish(tmp);
chatter_pub.publish(tmp);