A-A+

ExBot XI开发札记(二)iRobot Create底盘测试

2014年04月26日 ROS 评论 14 条 阅读 17,085 次

今天,我们来一起看看利用ROS来控制iRobot Create底盘。

view12

一、遥控控制

这部分请参考:Exbot xi开发札记(一)Exbot xi测试

二、通过编写node代码控制

先上代码:

#include <ros/ros.h>
#include <signal.h>
#include <geometry_msgs/Twist.h>

ros::Publisher cmdVelPub;

void shutdown(int sig)
{
	cmdVelPub.publish(geometry_msgs::Twist());
	ROS_INFO("exbot example move cpp ended!");
	ros::shutdown();
}

int main(int argc, char **argv)
{
	ros::init(argc, argv, "exbotxi_example_move");
	std::string topic = "cmd_vel";
	ros::NodeHandle node;
	cmdVelPub = node.advertise<geometry_msgs::Twist>(topic, 1);
	ros::Rate loopRate(50);
	signal(SIGINT, shutdown);
	ROS_INFO("exbot_example_move cpp start...");

	int rate = 50;
	double linear_speed = 0.2;
	double goal_distance = 1.0;
	double linear_duration = goal_distance / linear_speed;

	double angular_speed = 1.0;
	double goal_angle = 3.14/ 2.0;
	double angular_duration = goal_angle / angular_speed;

	geometry_msgs::Twist speed;
	//while(ros::ok())
	for(int i=0; i<1; i++)
	{
		speed = geometry_msgs::Twist();	
		
		int ticks = int(linear_duration * rate);
		speed.linear.x = linear_speed;
		//speed.angular.z = angular_speed;
		
		int t = 0;
		for(t=0; t<ticks; t++)
		{
			cmdVelPub.publish(speed);
			loopRate.sleep();
			//sleep(1);
		}
		//在旋转前停止机器人行走
		speed = geometry_msgs::Twist();
		cmdVelPub.publish(geometry_msgs::Twist());
		sleep(1);
		//loopRate.sleep();

		speed.angular.z = angular_speed;
		ticks = int(goal_angle * rate);
		for(t=0; t<ticks; t++)
		{
			cmdVelPub.publish(speed);
			loopRate.sleep();
		}

		cmdVelPub.publish(geometry_msgs::Twist());
		loopRate.sleep();
	}

	return 0;
}

此代码实现了沿着直线走1.0m,顺时针旋转180度的功能。
我们下面来对代码进行解读:

#include <ros/ros.h>
#include <signal.h>
#include <geometry_msgs/Twist.h>

一些头文件,geometry_msgs/Twist.h中包含了底盘的线速度和角速度信息。

ros::init(argc, argv, "exbotxi_example_move"); //初始化ROS
std::string topic = "cmd_vel"; //主题名字
ros::NodeHandle node; //定义节点
cmdVelPub = node.advertise<geometry_msgs::Twist>(topic, 1); //发布geometry_msgs::Twist消息
ros::Rate loopRate(50);
signal(SIGINT, shutdown); //用来接收Ctrl-C,退出程序的运行。
ROS_INFO("exbot_example_move cpp start...");
int rate = 50;
double linear_speed = 0.2;
double goal_distance = 1.0;
double linear_duration = goal_distance / linear_speed;

double angular_speed = 1.0;
double goal_angle = 3.14/ 2.0;
double angular_duration = goal_angle / angular_speed;

这里定义了行走的线速度以及角速度。

geometry_msgs::Twist speed;

用来发布速度信息。

for(int i=0; i<1; i++)
{
	speed = geometry_msgs::Twist();	
		
	int ticks = int(linear_duration * rate);
	speed.linear.x = linear_speed;
	//speed.angular.z = angular_speed;
		
	int t = 0;
	for(t=0; t<ticks; t++)
	{
		cmdVelPub.publish(speed);
		loopRate.sleep();
		//sleep(1);
	}
	//在旋转前停止机器人行走
	speed = geometry_msgs::Twist();
	cmdVelPub.publish(geometry_msgs::Twist());
	sleep(1);
	//loopRate.sleep();

	speed.angular.z = angular_speed;
	ticks = int(goal_angle * rate);
	for(t=0; t<ticks; t++)
	{
		cmdVelPub.publish(speed);
		loopRate.sleep();
	}

	cmdVelPub.publish(geometry_msgs::Twist());
	loopRate.sleep();
}

这里,设置好线速度和角速度后,将speed发布出去,让iRobot Create可以接收到。
这里向前行走1.0m,旋转180.0度,执行一遍。

上面就是代码的简单解释,其实ROS的核心就是pub/sub机制,一个节点publish主题,另一个节点subscribe它。
这样实现消息的传递。

后面我会将代码上传到github上,这样大家就可以下载下来直接在Exbot xi上面跑了。

Written by Exbot_玄影游侠,

转载请注明出处。

标签:

14 条留言  访客:14 条  博主:0 条

  1. 波波

    你好!主要有一下问题:1、对于这个irobotcreate.2 硬件有没有相关的资料(主要为电机及上面的传感器)? 2、如何如何实现相对精确的控制。 希望能够给与帮助,谢谢!

  2. drink

    谢谢,请问这个是发送控制部分,有没有接收部分的代码,即发给irobot底盘部分的代码?

    • poyoten

      你看看turtlebot_node这个package吧

  3. drink

    楼主,你这些代码的github地址是多少?

  4. 大红鹰

    楼主您好,我用的是ubuntu for ros hydro开发版,上述代码需要怎样配置才能通过指令进行运行呢?
    我在在 ~/catkin_ws/src/exbot_xi/exbotxi_example/nodes 下新建了move1.cpp文件,将上面的代码复制进去了,然后再上层目录的Cmakelists.txt里添加了add_executable(move1 nodes/move1.cpp)
    target_link_libraries(move ${catkin_LIBRARIES})
    运行rosrun exbotxi_example move1,
    提示Couldn't find executable named move1 below /home/exbot/catkin_ws/src/exbot_xi/exbotxi_example
    是move1.cpp没有编译生成move1?

    • bradlucas

      到~/catkin目录下,执行catkin_make。然后再运行就能找到包了。
      你的包没有编译。

      • 大红鹰

        我试试,谢谢啊

      • 大红鹰

        您好,我的操作如下:
        cd ~/catkin
        catkin_make
        然后,rosrun exbotxi_example move1
        还是提示Couldn't find executable named move1 below /home/exbot/catkin_ws/src/exbot_xi/exbotxi_example,不知道能不能提供一个这样的教程呢?

        • 火鸟

          您好,我也是想在自己创建的包里新建一个节点来订阅一个话题,我跟你的做法一样:
          在pkgtest(包名)的src目录下新建了test_listener.cpp,在上层目录的Cmakelists.txt里添加了
          add_executable(test_listener src/test_listener.cpp)
          target_link_libraries(test_listener ${catkin_LIBRARIES})
          再cd到catkin_ws下执行catkin_make
          得到:
          [ 25%] [ 50%] Built target test_listener
          Built target usb_cam
          [ 75%] Built target frame_tf_broadcaster
          [100%] Built target usb_cam_node
          然后我运行rosrun pkgtest test_listener
          提示说[rosrun] Couldn't find executable named test_listener below /home/siat/catkin_ws/src/pkgtest
          我这又是怎么回事呢,貌似没什么问题吧

          • poyoten

            看你过程没啥问题。请先看下test_listener有没有编译生成。

            • 火鸟

              编译生成了可执行文件,我把它复制到pkgtest/src文件夹下跟.cpp文件放在一起他就能运行了,请问这是怎么回事呢

      • 大红鹰

        搞定了,粗心了,target_link_libraries(move ${catkin_LIBRARIES})这里没改,应该是target_link_libraries(move1 ${catkin_LIBRARIES})
        谢谢啊,不过还有个问题,就是是否每编写一个代码,都需要这样将catkin_ws(我的是Ubuntu for ROS h2版,catkin_ws是默认的工作空间)整个都catkin_make下吗?就是要将整个工作空间都catkin_make下?
        那如果我要自己建立一个工作空间呢?比如命名为mycatkin_ws,然后按照wiki上的操作就可以了么?我按照wiki上的执行了创建的步骤,在查看依赖时(rospack depends1 beginner_tutorials),提示错误,谢谢~

        • poyoten

          是rospack depends1 beginner_tutorials?还是rospack depends beginner_tutorials?什么错误?

给我留言

Copyright © ExBot易科机器人实验室 保留所有权利.   Theme   Robin modified by poyoten

用户登录

分享到: