ros使用

  1. 如何建立工作空间
    在终端(通过快捷键Ctrl+Alt+T打开)中执行如下命令:
    mkdir -p ~/catkin_ws/src
    到此,一个空白的工作空间已建立好了,”~/catkin_ws” 即为工作空间(~是主文件夹,即 ”/home/用户名”;工作空间也可被命为其它名字)。包将建立在工作空间中的src文件夹中。

  2. 如何建立包
    在终端中执行如下命令:
    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
)

  1. 在根工作空间下打开终端
    /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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值