先锋机器人ROS入门rosaria + 无线遥控

59 篇文章 0 订阅
48 篇文章 0 订阅

入门:http://wiki.ros.org/ROSARIA/Tutorials/How%20to%20use%20ROSARIA
官方:http://wiki.ros.org/Robots/AMR_Pioneer_Compatible
参考:http://blog.csdn.net/ferriswym/article/details/63254935
模型:https://github.com/MobileRobots/amr-ros-config
用户:http://blog.csdn.net/david_han008/article/details/53966532
当前系统为ROS Indigo & Ubuntu14.04

  1. 安装MobileSim
    使用“mobilesim_0.7.3+ubuntu12+gcc4.6_amd64.deb”安装MobileSim
    如果出现不满足的依赖项“lib-font”
    sudo apt-get -f install

  2. 安装rosaria
    方法一:
    安装"libaira_2.9.0+ubuntu12.04+gcc4.6_amd56.deb"
    sudo dpkg -i libaria…
    cd ~
    mkdir -p ~/pioneer_ws/src
    catkin_init_workspace
    cd ~/pioneer
    catkin_make
    echo “source ~/pioneer_ws/devel/setup.bash” >> ~/.bashrc
    cd ~/pioneer_ws/src
    git clone https://github.com/amor-ros-pkg/rosaria.git
    如果没有安装git
    sudo apt-get install git
    cd ~/pioneer_ws
    编译:catkin_make
    如果编译报错,尝试 catkin_make --force-cmake(此处显示有问题,不是简写是两个-)
    方法2:使用rosdep install 自动解决依赖项(不需要安装libaria)
    cd ~
    mkdir -p ~/pioneer_ws/src
    catkin_init_workspace
    cd ~/pioneer
    catkin_make
    echo “source ~/pioneer_ws/devel/setup.bash” >> ~/.bashrc
    cd src
    git clone https://github.com/amor-ros-pkg/rosaria.git
    git clone https://github.com/pengtang/rosaria_client

    cd ~/pioneer_ws
    rosdep update
    rosdep install rosaria
    catkin_make

  3. 运行仿真
    roscore
    cd /usr/local/Mobilesim
    ./Mobilesim

    rosrun rosaria Rosaria

    /RosAria/battery_recharge_state
    /RosAria/battery_state_of_charge
    /RosAria/battery_voltage
    /RosAria/bumper_state
    /RosAria/cmd_vel
    /RosAria/motors_state
    /RosAria/parameter_descriptions
    /RosAria/parameter_updates
    /RosAria/pose
    /RosAria/sonar
    /RosAria/sonar_pointcloud2
    /rosout
    /rosout_agg
    /tf
    

    rostopic pub -r 3 /RosAria/cmd_vel geometry_msgs/Twist ‘[1,0,0]’ ‘[0,0,1]’

  4. 实体机器人运行
    sudo usermod -a -G dialout $USER
    //很多人不懂上一句的意思,dialout 是linux 默认自带的用户群组,你在/erc/groups 文件夹中即可看到,而设备文件如下面的tty就属于该群组,所以将你的用户名添加到该群组才能对设备文件进行读写。
    sudo chmod a+rw /dev/ttyUSB0 //赋予端口权限
    如果机器人自带工控机端口应该是ttyS0
    如果用户使用USB2Serial 端口应该是ttyUSB0
    出厂含工控机内运行:
    ssh usrname@IP
    rosrun rosaria RosAria _port:=/dev/ttyS0
    用户笔记本运行:
    rosrun rosaria RosAria _port:=/dev/ttyUSB0
    pioneer3 AT/DX 串口速率为9600
    pioneer LX 串口速率为57600,如果连接不通,rb=57600(指定参数port)
    这里写图片描述

  5. 安装另一个rosaria_client 软件包
    cd ~/pioneer_ws/src
    git clone https://github.com/pengtang/rosaria_client
    catkin_make

    (编译之后在结点文件在哪儿?)
    	<!! cd ~/pioneer_ws/devel/lib/rosaria>
    				<!! cd ~/pioneer_ws/devel/lib/rosaria_client>
    
  6. 运行办法
    单个结点运行:
    rosrun rosaria RosAria
    rosrun rosaria_client interface
    launch文件运行
    需要关闭执行的结点,然后由launch文件同时启动两个结点。
    launch文件定义了端口,如需要,请修改。

<launch>
	<!--leemanchina coffee-->
    <node pkg="rosaria" type="RosAria" name="RosAria" output="screen">
        <remap from="/RosAria/cmd_vel" to="/cmd_vel"/>
        <remap from="/RosAria/pose" to="/odom"/>
		<param name="port" value="ttyUSB0"/>
    </node>
	
	<!--sudo usermod -a -G dialout $USER-->
	<!--sudo usermod -a -G tty $USER-->
	<!--sudo chmod a+x /dev/ttyUSB0-->

    <node pkg="rosaria_client" type="teleop" name="RosAria_interface" output="screen">
        <remap from="/RosAria/cmd_vel" to="/cmd_vel"/>

    </node>

</launch>

LX 运行的时候,需要制定端口波特率为57600 , DX AT Amigobot 为9600
LX 端口配置情况
http://robots.mobilerobots.com/wiki/Pioneer_LX_Serial_Ports
7. Node信息
rosnode info RosAria
-----------------
Node [/RosAria]
Publications:
* /RosAria/sonar_pointcloud2 [sensor_msgs/PointCloud2]
* /RosAria/pose [nav_msgs/Odometry]
* /RosAria/parameter_descriptions [dynamic_reconfigure/ConfigDescription]
* /RosAria/motors_state [std_msgs/Bool]
* /rosout [rosgraph_msgs/Log]
* /tf [tf2_msgs/TFMessage]
* /RosAria/parameter_updates [dynamic_reconfigure/Config]
* /RosAria/battery_state_of_charge [std_msgs/Float32]
* /RosAria/bumper_state [rosaria/BumperState]
* /RosAria/battery_voltage [std_msgs/Float64]
* /RosAria/battery_recharge_state [std_msgs/Int8]
* /RosAria/sonar [sensor_msgs/PointCloud]

	Subscriptions: 
	 * /RosAria/cmd_vel [geometry_msgs/Twist]

	Services: 
	 * /RosAria/set_parameters
	 * /RosAria/get_loggers
	 * /RosAria/set_logger_level
	 * /RosAria/enable_motors
	 * /RosAria/disable_motors
contacting node http://ubuntu:35467/ ...
	Pid: 11927
Connections:
	 * topic: /rosout
    * to: /rosout
   * direction: outbound
    * transport: TCPROS
====================================
rostopic type /RosAria/cmd_vel
	geometry_msgs/Twist
rosmsg show geometry_msgs/Twist

你的先锋有激光吗?
你们激光数据如何发布?
方法如下:
这里写图片描述
参考rosaria wiki
私有参数publish_aria_lasers
这里写图片描述
方法参考:http://blog.csdn.net/qq_35508344/article/details/78888287
8. 服务调用的方法
rosservice list
rosservice call /RosAria/enable_motors
(看不出效果)
9. client 运行 interface 例子

代码注解参考:
http://blog.csdn.net/david_han008/article/details/56485646

demo_pioneer
使用罗技F710 无线手柄

http://wiki.ros.org/demo_pioneer
https://github.com/lagadic/demo_pioneer

暂时我手边没有F710,但是有一个罗技 ATK3
运行rosrun joy joy_node
rostopic echo /joy
此时你将可以熟悉axis的值和button具体的按钮,实时打印到终端呀!
如果你想将demo_pioneer代码用上,你可能不得不修改几个值了,比如button或者axis
其他的手柄应该也是这个套路。
只是这个收到joy消息后,只发布一次。所以实际跑可能会卡顿。

#include <ros/ros.h>
#include <ros/console.h>
#include <sensor_msgs/Joy.h>
#include <geometry_msgs/Twist.h>

class Joy2twist
{
private:
  ros::NodeHandle nh_;
  ros::Publisher  pubTwist_;
  ros::Subscriber subJoy_;
  ros::Subscriber subTwist_;

  geometry_msgs::Twist in_cmd_vel_; // input cmd_vel

  bool joystrick_drive_;

public:
  void joyCallback(const sensor_msgs::Joy::ConstPtr& msg);
  void twistCallback(const geometry_msgs::Twist::ConstPtr& msg);
  Joy2twist(int argc, char**argv);
  virtual ~Joy2twist(){};
};

Joy2twist::Joy2twist(int argc, char**argv)
{
  joystrick_drive_ = true;
  subJoy_   = nh_.subscribe("joy", 1000, &Joy2twist::joyCallback, this);
  subTwist_ = nh_.subscribe("cmd_vel", 1000, &Joy2twist::twistCallback, this);
  pubTwist_ = nh_.advertise<geometry_msgs::Twist>("RosAria/cmd_vel", 1000);
}

void Joy2twist::joyCallback(const sensor_msgs::Joy::ConstPtr& msg)
{
  std::ostringstream strs;
  strs << std::endl << "axes: [";
  for(size_t i=0; i < msg->axes.size(); i++)
      strs << msg->axes[i] << ",";
  strs << "]" << std::endl;
  strs << "button: [";
  for(size_t i=0; i < msg->buttons.size(); i++)
      strs << msg->buttons[i] << ",";
  strs << "]" << std::endl;
  std::string str;
  str = strs.str();
  ROS_DEBUG("%s", str.c_str());

  // Use Logitech wireless gamepad F710
  // if buton 4 (front left) or 5 (front right) active
  //   out_cmd_vel = in_cmd_vel
  // else
  //   out_cmd_vel = vitesse joy
  //   axe 3 (horizontal) = angular vel
  //   axe 4 (vertical)   = linera  vel along x
  if (msg->buttons[4] || msg->buttons[0])
    joystrick_drive_ = false;
  else
    joystrick_drive_ = true;

  geometry_msgs::Twist out_cmd_vel;
  if (! joystrick_drive_)
    out_cmd_vel = in_cmd_vel_;
  else {
    out_cmd_vel.angular.z = msg->axes[0];
    out_cmd_vel.linear.x = msg->axes[1];
  }
  pubTwist_.publish(out_cmd_vel);
}

void Joy2twist::twistCallback(const geometry_msgs::Twist::ConstPtr& msg)
{
  // memorize the command
  in_cmd_vel_.angular = msg->angular;
  in_cmd_vel_.linear  = msg->linear;
  // publish the command if joystick button pressed
  if (! joystrick_drive_) {
    geometry_msgs::Twist out_cmd_vel;
    out_cmd_vel = in_cmd_vel_;
    pubTwist_.publish(out_cmd_vel);
  }
}

int main(int argc, char **argv)
{
  ros::init(argc, argv, "joy2twist");

  Joy2twist joy2twist(argc, argv);

  ros::spin();
}

另一个包,可以参考
https://github.com/ros-teleop/teleop_twist_joy/blob/indigo-devel/src/teleop_twist_joy.cpp
husky 出厂默认使用F710,应该就是这个包。

turtlebot_teleop 类似包参考
https://github.com/ros-drivers/joystick_drivers_tutorials

// %Tag(FULL)%
// %Tag(INCLUDE)%
#include <ros/ros.h>
#include <turtlesim/Velocity.h>
#include <sensor_msgs/Joy.h>
// %EndTag(INCLUDE)%
// %Tag(CLASSDEF)%
class TeleopTurtle
{
public:
  TeleopTurtle();

private:
  void joyCallback(const sensor_msgs::Joy::ConstPtr& joy);
  
  ros::NodeHandle nh_;

  int linear_, angular_;
  double l_scale_, a_scale_;
  ros::Publisher vel_pub_;
  ros::Subscriber joy_sub_;
  
};
// %EndTag(CLASSDEF)%
// %Tag(PARAMS)%
TeleopTurtle::TeleopTurtle():
  linear_(1),
  angular_(2)
{

  nh_.param("axis_linear", linear_, linear_);
  nh_.param("axis_angular", angular_, angular_);
  nh_.param("scale_angular", a_scale_, a_scale_);
  nh_.param("scale_linear", l_scale_, l_scale_);
// %EndTag(PARAMS)%
// %Tag(PUB)%
  vel_pub_ = nh_.advertise<turtlesim::Velocity>("turtle1/command_velocity", 1);
// %EndTag(PUB)%
// %Tag(SUB)%
  joy_sub_ = nh_.subscribe<sensor_msgs::Joy>("joy", 10, &TeleopTurtle::joyCallback, this);
// %EndTag(SUB)%
}
// %Tag(CALLBACK)%
void TeleopTurtle::joyCallback(const sensor_msgs::Joy::ConstPtr& joy)
{
  turtlesim::Velocity vel;
  vel.angular = a_scale_*joy->axes[angular_];
  vel.linear = l_scale_*joy->axes[linear_];
  vel_pub_.publish(vel);
}
// %EndTag(CALLBACK)%
// %Tag(MAIN)%
int main(int argc, char** argv)
{
  ros::init(argc, argv, "teleop_turtle");
  TeleopTurtle teleop_turtle;

  ros::spin();
}
// %EndTag(MAIN)%
// %EndTag(FULL)%

launchfile 和param设置

<launch>

 <!-- Turtlesim Node-->
  <node pkg="turtlesim" type="turtlesim_node" name="sim"/>


 <!-- joy node -->
  <node respawn="true" pkg="joy"
        type="joy" name="turtle_joy" >
    <param name="dev" type="string" value="/dev/input/js0" />
    <param name="deadzone" value="0.12" />
  </node>

 <!-- Axes -->
  <param name="axis_linear" value="1" type="int"/>
  <param name="axis_angular" value="0" type="int"/>
  <param name="scale_linear" value="2" type="double"/>
  <param name="scale_angular" value="2" type="double"/>

  <node pkg="turtle_teleop" type="turtle_teleop_joy" name="teleop"/>

</launch>

https://github.com/ros-teleop/teleop_twist_joy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值