入门: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
-
安装MobileSim
使用“mobilesim_0.7.3+ubuntu12+gcc4.6_amd64.deb”安装MobileSim
如果出现不满足的依赖项“lib-font”
sudo apt-get -f install -
安装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_clientcd ~/pioneer_ws
rosdep update
rosdep install rosaria
catkin_make -
运行仿真
roscore
cd /usr/local/Mobilesim
./Mobilesimrosrun 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]’
-
实体机器人运行
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)
-
安装另一个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>
-
运行办法
单个结点运行:
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