Use MATLAB Robotics System Toolbox to receive ROS message

조회 수: 31 (최근 30일)
wjchen84
wjchen84 2015년 4월 9일
답변: alisha 2023년 7월 11일
I was trying to use Robotics System Toolbox(MATLAB 2015a on windows 7) to communicate with the ROS running on Ubuntu 14.04. The "rosinit" was successful and MATLAB can see the rosnode list, rostopic list, etc. I can also create the rossubscriber from MATLAB to any topic successfully. But when I run "receive" command, it just wait forever until timeout. It seems no new message is coming which should not be the case (as I am sure the ROS on Ubuntu is constantly publishing the new kinect images).
I have tried several different settings for rosinit, such as using ROS_MASTER_URI, ROS_IP, etc. Also the two PCs can ping each other's IP successfully. So I think the network connection between the two machines should be good. But MATLAB still couldn't receive the message although it can see and subscribe the topic.
Could anyone suggest any possible cause for this issue? Your help would be really appreciated!

채택된 답변

wjchen84
wjchen84 2015년 4월 9일
I figureed out the solution for this problem. The following steps seem to be helpful:
1. In Ubuntu PC hosts file (/etc/hosts), add the hostnames and the IP addresses of both Ubuntu PC and Windows PC
2. In Windows PC host file (/windows/system32/driver/etc/host), do the same thing as in previous step
3. Turn off all the firewalls on Window PC and Ubuntu PC (if there is any)
4. Reboot both machines to make the new host files effective
5. Set the following environment variables on Ubuntu PC
sudo gedit ~/.bashrc
Add the following lines in .bashrc file, save and then restart terminal
export ROS_MASTER_URI=http://Ubuntu_PC_IP:11311
export ROS_IP=Ubuntu_PC_IP
6. On Windows MATLAB, set the environment variables for ROS:
setenv('ROS_MASTER_URI','http://Ubuntu_PC_IP:11311')
setenv('ROS_IP','Windows_PC_IP')
rosinit
Then it should work. I did almost everything except Step 2, which caused the above problem. I hope this would help someone who has the similar problem.
  댓글 수: 3
Mark Levin
Mark Levin 2015년 12월 16일
Does it works with real robot? I mean, if I have Turtlebot for example (I have Jackal, but I don't think there is a difference) - should I change bashrc on the robot?
Chawki CRTL
Chawki CRTL 2018년 5월 5일
편집: Chawki CRTL 2018년 5월 5일
I don't know how to thank you "wjchen84", you saved my life thank you so much :)

댓글을 달려면 로그인하십시오.

추가 답변 (5개)

Stefan
Stefan 2017년 6월 13일
편집: Stefan 2017년 6월 13일
I ran into the same problem with 2 computers:
- Windows7 + Matlab R2017a with Robotics System Toolbox
- Ubuntu 14.04 + ROS
The solution was to do explicitly indicate variable ROS_IP on the Ubuntu PC (as shown by wjchen84 at step5).
For interested readers, I'd like to indicate some other links that I found useful on the same topic:
https://nl.mathworks.com/matlabcentral/answers/119559-why-is-the-ros-subscriber-callback-in-matlab-not-triggered-when-messages-are-published-from-an-exter
google: "defining the ROS_IP solved my problem. I had different network interfaces (wlan0, eth0, etc) and I had to explicitly tell ROS which one to use. This is clearly explained in http://www.ros.org/wiki/ROS/EnvironmentVariables : "This setting is only needed in situations where you have multiple addresses for a computer and need to force ROS to a particular one."

Aaditya Saraiya
Aaditya Saraiya 2017년 9월 14일
Thank you so much. This works. Interfaced Ubuntu 16.04 (ROS Kinetic Kame) and MATLAB 2016a on Windows 10.

Ilya Boyur
Ilya Boyur 2017년 11월 3일
Hello everybody, I ran into the same problem with Windows 10 (MATLAB 2017a) and Ubuntu 16.04 amd64 ROS Kinetic. I did as wjchen84 suggested, except I edited file C:\Windows\system32\drivers\etc\hosts and on Ubuntu /etc/hosts:
192.168.111.100 UBUNTU_PC_IP
192.168.111.5 WINDOWS_PC_IP
Rebooted machines, turned off firewalls as suggested. Now, when I run in MATLAB (Windows):
[name, address] =resolvehost('UBUNTU_PC_IP')
name =
'ubuntu_pc_ip'
address =
'192.168.111.100'
Seems to work fine, yeah? But:
setenv('ROS_MASTER_URI','http://UBUNTU_PC_IP:11311');
setenv('ROS_IP','WINDOWS_PC_IP');
rosinit
*The value of the ROS_MASTER_URI environment variable, http://UBUNTU_PC_IP:11311, is an invalid URI.
Check the URI for correctness.*
As the same, direct IP configuration for setenv() in MATLAB doesn't work.
How to check that my host names resolved right if not with resolvehost? Hope anyone faced the same issue.
  댓글 수: 2
Pavel Roslovets
Pavel Roslovets 2017년 11월 8일
Try to remove underscores from host names:
setenv('ROS_MASTER_URI','http://UBUNTUPCIP:11311');
setenv('ROS_IP','WINDOWSPCIP');
rosinit
Don't forget to do it in host file
Ilya Boyur
Ilya Boyur 2017년 12월 6일
Thanks, Pavel, removing underscores in hosts file resolved the issue.

댓글을 달려면 로그인하십시오.


sarra elghali
sarra elghali 2018년 3월 13일
Hi everyone,I ahd the same problem with Windows 10 (MATLAB 2017a) and Ubuntu 16.04 amd64 ROS Kinetic. I did fellow all the steps. (for my windows IP adress, I'm not sure if i should take IPv4 Address or default Gateway)
setenv('ROS_MASTER_URI','http://192.168.65.82:11311') >> setenv('ROS_MASTER_URI','http://192.168.65.82:11311') >> setenv('ROS_IP','192.168.65.80') >> rosinit *The value of the ROS_MASTER_URI environment variable, http://192.168.65.82:11311, will be used to connect to the ROS master. The value of the ROS_IP environment variable, 192.168.65.80, will be used to set the advertised address for the ROS node. Initializing global node /matlab_global_node_67130 with NodeURI http://192.168.65.80:50121/*
Now, when I try to get message using this commande msgg=receive(hw,10) // hw is the name of my subscriber i got this error : Error using robotics.ros.Subscriber/receive (line 325) The function did not receive any data and timed out.
Can anyone help me please ?
  댓글 수: 2
Ilya Boyur
Ilya Boyur 2018년 3월 14일
Hi, Sarra Elghali, check first connection between computers/systems running ros:
  • simple command line ping, MATLAB !ping
  • rosnode ping - from MATLAB and from actually ros-running linux
If there are any problems - check your network - all nodes should be also in same network submask (f.e. 255.255.255.0, than node with ROS_IP 192.168.1.2 will publish to 192.168.1.5 and will not publish to 192.168.5.5). Then, let's see what you have.
sarra elghali
sarra elghali 2018년 3월 14일
Hi, thanks for your replay, My ROS_IP is 192.168.65.80 and ROS_MASTER_URI is 192.168.65.82, they alreday have the same Mask. when I use !ping 192.168.65.82 in matlab command window, It's ping to that adress successfully. you can see here , I even got a no error when I connect to ROS master
[name, address] =resolvehost('WindowsPCIP')
name =
'windowspcip'
address =
'192.168.65.80'
>> [name, address] =resolvehost('UbuntuPCIP')
name =
'ubuntupcip'
address =
'192.168.65.82'
>> setenv('ROS_MASTER_URI','http://ubuntupcip:11311') >> setenv('ROS_IP','windowspcip') >> rosinit
The value of the ROS_MASTER_URI environment variable, http://ubuntupcip:11311, will be used to connect to the ROS master. The value of the ROS_IP environment variable, windowspcip, will be used to set the advertised address for the ROS node. Initializing global node /matlab_global_node_09027 with NodeURI http://windowspcip:49943/
But I still got an empty msg from my subscriber
hw_status =
Subscriber with properties:
TopicName: '/Niryo_one/hardware_status'
MessageType: 'niryo_one_msgs/HardwareStatus'
LatestMessage: [0×1 HardwareStatus]
BufferSize: 1
NewMessageFcn: []
>> hwmesg=rosmessage(hw_status)
hwmesg =
ROS HardwareStatus message with properties:
MessageType: 'niryo_one_msgs/HardwareStatus'
Header: [1×1 Header]
RpiTemperature: 0
ConnectionUp: 0
ErrorMessage: ''
CalibrationNeeded: 0
CalibrationInProgress: 0
MotorNames: {0×1 cell}
MotorTypes: {0×1 cell}
Temperatures: [0×1 int32]
Voltages: [0×1 double]
HardwareErrors: [0×1 int32]
In Ubuntu, I already run those command
export ROS_MASTER_URI=http://UbuntuPCIP:11311
export ROS_IP=UbuntuPCIP and I added in /etc/hosts file 192.168.65.82 UbuntuPCIP 192.168.65.80 WindowsPCIP
My ros nodes in Ubuntu_Pc run at start_up,automatically but I don't this is may cause problems.

댓글을 달려면 로그인하십시오.


alisha
alisha 2023년 7월 11일
Appreciate everyone's help. Flappy Bird

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by